2014-01-07 3 views
1

Я получаю сообщение об ошибке моего оператора Vec2 <, я понятия не имею, что не так.Что не так с моим оператором <?

bool Vec2::operator<(const Vec2& v) const 
{ 
    if(x < v.x) 
     return true; 
    else 
     return y < v.y; 
} 

Недопустимый оператор < для СТД вставки

template<class _Pr, class _Ty1, class _Ty2> inline 
    bool __CLRCALL_OR_CDECL _Debug_lt_pred(_Pr _Pred, const _Ty1& _Left, const _Ty2& _Right, 
     const wchar_t *_Where, unsigned int _Line) 
    { // test if _Pred(_Left, _Right) and _Pred is strict weak ordering 
    if (!_Pred(_Left, _Right)) 
     return (false); 
    else if (_Pred(_Right, _Left)) 
     _DEBUG_ERROR2("invalid operator<", _Where, _Line); 
    return (true); 
    } 

Благодарности

+2

Что такое утверждение? –

+0

Недопустимый оператор <для установки в std – jmasterx

+0

[Возможный дубликат?] (Http://stackoverflow.com/questions/9040689/stl -less-operator-and-invalid-operator-error) –

ответ

4

Проблема заключается в том, что этот оператор не удовлетворяет слабому упорядочению. Например, рассмотрим две точки

(2, 1) и (1, 2)

(2, 1) меньше (1, 2), так как второе значение 1 меньше 2.

В то же время (1, 2) также меньше (2, 1), потому что первое значение 1 меньше первого значения 2.

Посмотрите, как оператор thsi определен для стандартного класса std :: pair и использует тот же оператор.

1

Скорректированный способ удовлетворить Упорядочение:

bool Vec2::operator<(const Vec2& v) const 
{ 
    if(x < v.x) 
     return true; 
    if(x > v.x) 
     return false; 
    else   
     return y < v.y; 
} 

Или (режим гольф-код):

bool Vec2::operator<(const Vec2& v) const 
{ 
    return (x != v.x)? (x < v.x) 
        : (y < v.y) ; 
} 
0

Обычно для сравнения, как это, вы хотите, чтобы сравнить первую пару пунктов , тогда тогда и только тогда, когда они равны, сравните вторую пару (и так далее).

if (x < v.x) 
    return true; 
if (x > v.x) 
    return false; 
return y < v.y; 
0

operator < должны удовлетворять Strict weak ordering.

Короткий путь, чтобы сделать работу:

bool Vec2::operator< (const Vec2& v) const 
{ 
    return std::tie(x, y) < std::tie(v.x, v.y); 
} 
Смежные вопросы