2014-09-02 2 views
0

У меня есть вектор, заполненный значениями настраиваемого типа, и алгоритм find() жалуется, что не может найти подходящий оператор == для сравнения значений. Я реализовал это следующим образом:C++ - оператор не найден

bool Ship::operator==(const Ship& source) { 
    return (_type == source._type && 
      _damagedSquares == source._damagedSquares && 
      _orientation == source._orientation && _state == source._state); 
} 

Я также пробовал метод «друга», но это тоже не работает. Сам класс структурирована следующим образом:

class Ship { 
private: 
    ShipType _type; 
    int _damagedSquares; 
    ShipOrientation _orientation; 
    ShipState _state; 

public: 
    Ship(); 
    Ship(ShipType type); 
    ~Ship(); 

    bool operator==(const Ship& source); 
}; 

Что я здесь делаю неправильно?

Дополнительная информация:

std::vector<Ship> remainingShips; 
MultiArray& squares = opponentGridCopy.GetSquares(); 
for (RowIterator rowIterator = squares.begin(); rowIterator != squares.end(); 
    ++rowIterator) { 
    for (ColumnIterator columnIterator = rowIterator->begin(); 
     columnIterator != rowIterator->end(); ++columnIterator) { 
     Square* current = &(*columnIterator); 
     SquareState currentState = current->GetState(); 
     if (currentState != SquareState::Hit) 
      current->SetState(SquareState::Vacant); 
     Ship* potentialShip = current->GetOwner(); 
     if (potentialShip != nullptr) { 
      int damagedSquares = potentialShip->GetDamagedSquares(); 
      if (!damagedSquares) { 
       current->SetState(SquareState::Populated); 
       break; 
      } 
      if (remainingShips.empty() || 
       std::find(remainingShips.begin(), remainingShips.end(), 
          potentialShip) == 
        remainingShips.end()) // should be *potentialShip 
       remainingShips.push_back(*potentialShip); 
     } 
    } 
} 
return remainingShips; 

Я проходил указатель в качестве сравнения значения ... Просто разыменовываются его и найти() теперь работает.

+0

Не могли бы вы показать свой контейнер и вызов 'std :: find'? – P0W

+1

Вы используете 'std :: vector '? Вышеуказанный код в порядке –

+0

@Venom Не могли бы вы показать полное сообщение об ошибке? –

ответ

1
Ship* potentialShip = ... 
std::find(remainingShips.begin(), remainingShips.end(), potentialShip) 

вы пытаетесь найти указатель в то время как вектор, где поиск выполняется определяется как

std::vector<Ship> remainingShips; 

вы сравниваете указатель с объектом судов и, таким образом, ваше сравнение является неправильным

bool Ship::operator==(const Ship& source) // Accepts a Ship reference, not a pointer 

Чтобы исправить это, либо разыщите указатель, либо измените функцию сравнения.

+0

Да, я тоже это заметил. Все равно спасибо. – Venom

5

Объявите ваш оператор сравнения так:

bool Ship::operator==(const Ship &source) const 

Примечание задн const.

+2

MSVC все еще возвращает C2678. – Venom

+0

Можете ли вы опубликовать код с помощью 'vector' и' find', а затем? – doctorlove

+1

Это ** не ** правильный ответ –

1

Ваш

bool operator==(const Ship& source); 

Если быть константной, а также, а именно

bool operator==(const Ship& source) const; 

Но на самом деле, я предпочитаю иметь симметричные операторы, не как методы членов. Рассмотрите:

Class Ship 
{ 
private: 
    ShipType _type; 
    int _damagedSquares; 
    ShipOrientation _orientation; 
    ShipState _state; 

public: 
    Ship(); 
    Ship(ShipType type); 
    ~Ship(); 

    static bool eq(const Ship& s0, const Ship& s1) 
    { 
     return (s0._type == s1._type && 
     s0.damagedSquares == s1._damagedSquares && 
     s0._orientation == s1._orientation && 
     s0._state == s1._state); 
    } 

}; 

inline bool operator==(const Ship& s0, const Ship& s1) 
{ 
    return Ship::eq(s0, s1); 
} 
+0

В более общем смысле, я просто определял бы функцию 'isEqual' и получал бы из' ComparisonOperators ', шаблон, который предоставляет все операторы сравнения из' isEqual' или 'compare', в зависимости от того, что доступно. –

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