2015-05-26 3 views
0

Когда я пытаюсь собрать этот источник в C++:ошибка: использование перегруженного оператора «*» неоднозначно

void ParticleSystem::setState(std::vector<Vec2f>& statesVector) 
{ 
    std::vector<Vec2f> pState(2); 
    for (int i = 0; i < 2*np; i += 2) { 
     pState[0] = *statesVector[i]; 
     pState[1] = *(statesVector[i+1]); 
     (*particles[i/2]).setState(pState); 
    } 
} 

Я получаю следующее сообщение об ошибке:

ParticleSystem.cpp:110:15: error: use of overloaded operator '*' is ambiguous (operand type 
    'value_type' (aka 'gfx::TVec2<float>')) 
      pState[0] = *statesVector[i]; 
         ^~~~~~~~~~~~~~~~ 
ParticleSystem.cpp:110:15: note: built-in candidate operator*(float *) 
ParticleSystem.cpp:110:15: note: built-in candidate operator*(const float *) 
ParticleSystem.cpp:111:15: error: use of overloaded operator '*' is ambiguous (operand type 
    'value_type' (aka 'gfx::TVec2<float>')) 
      pState[1] = *(statesVector[i+1]); 

У меня есть вид на ошибки уже на форумах и следил за некоторыми шагами, но я никогда не заставляю его работать. Более того, я также пытался понять объяснение в примечаниях об ошибке, но я не могу. Я действительно надеюсь, что кто-то может мне помочь.

И, наконец, если кто-то оценивает этот вопрос отрицательно, по крайней мере, объясните, почему, пожалуйста.

+0

Является ли 'Vec2f' указателем на функцию? – IllusiveBrian

+0

'statesVector [i]' оценивается как 'Vec2f &'. Не существует унарного оператора '*', определенного для 'Vec2f'. Непонятно, что вы намерены делать в этой линии. –

+0

И fyi, 'operator []' имеет [более высокий приоритет] (http://en.cppreference.com/w/cpp/language/operator_precedence), чем 'operator *' независимо. Вы, наверное, должны различать то, что вы * на самом деле пытаетесь сделать в первую очередь. И, пожалуйста, укажите * в своем вопросе *, что такое 'Vec2f' на самом деле * *. Существует множество наборов инструментов, которые объявляют типы этим именем, и вы не указали конкретных указаний, которые вы используете. * Реальный * [MCVE] (https://stackoverflow.com/help/mcve) поможет * безмерно *. – WhozCraig

ответ

2

Проблема в том, что вы не поняли синтаксис, который содержит ссылки. Пока вы указываете ссылку с &, вы используете ее так же, как вы бы использовали фактическую переменную, а не как указатель, а это означает, что вы не можете использовать оператор * (если это не ссылка на тип указателя). Использование оператора * дает такие же эффекты, как если бы вы использовали его на обычной переменной.

Вы можете устранить проблему путем удаления * в вашем коде, как это:

pState[0] = statesVector[i]; 
    pState[1] = statesVector[i+1]; 
    particles[i/2].setState(pState); 

Ваш код может составить как если вы определили operator* в Vec2f классе и сделал его вернуть Vec2f. Однако это не имеет смысла в семантической точке зрения (разыменованное значение не должно давать что-то одного типа), так что это не способ исправить вашу проблему.

Смежные вопросы