2013-06-14 2 views
4

Я создал некоторый объект с перегруженным оператором == в нем.Могу ли я использовать оператор == для указателей?

class Corridor 
    { 
    public: 
     Corridor(int iStart, int iEnd); 
     ~Corridor(); 

     // Overloaded operators to simplify search in container. 
     friend bool operator==(const Corridor& lhs, const int rhs); 
     friend bool operator==(const int lhs, const Corridor& rhs); 

    protected: 
     int m_iIntersectionIDStart; 
     int m_iIntersectionIDEnd; 
    }; 

В этом случае, если я где-то создать вектор коридорами:

vector<Corridor> m_vCorridors; 

proggram работает отлично, и я могу использовать найти алгоритм:

auto itCorridor = find(m_vCorridors.begin(), m_vCorridors.end(), someID); 

НО в случае, если Я создаю вектор указателей:

vector<Corridor*> m_vCorridors; 

Я получаю ошибки: Ошибка 1 ошибка C2446: '==': нет преобразования из 'const int' в 'Corridor *' c: \ program files (x86) \ microsoft visual studio 10.0 \ vc \ include \ algorithm 41 Ошибка 2 ошибки C2040: '==': 'Коридор *' отличается в уровнях косвенности от 'const int' c: \ program files (x86) \ microsoft visual studio 10.0 \ vc \ include \ algorithm 41

Пробовал overload operator == по-разному, но это не работает для этого случая. Кто-нибудь знает, что я должен сделать, чтобы решить проблему?

+1

Посмотрите 'find_if'. –

+0

Предупреждение: если ваша реализация 'operator ==' tests 'if (intValue> = m_iIntersectionIDStart && intValue <= m_iIntersectionIDEnd)', ваш оператор равенства не удовлетворяет переходному отношению: возможно иметь значения 'int'' a' и 'c' и экземпляр' Corridor' 'b', такой, что' a == b' и 'b == c', но' a! = c'. Я бы рекомендовал вместо этого определить функцию-член, например. 'Contains (int)' для проверки этого отношения вместо этого, чтобы избежать возможных ошибок и путаницы. –

ответ

9

Это потому, что find пытается сравнить указатель с Corridor с int. Чтобы сравнить Corridor с int, вам необходимо установить собственный компаратор, используя find_if. Предполагая, что вы можете использовать C++ 11 lambdas,

find_if(m_vCorridors.begin(), m_vCorridors.end(), [=](Corridor* cp) { 
    return *cp == someID; 
}); 
+0

Это работает, но как я могу изменить 'someID' во время запуска программы? Если я использую компаратор с двумя параметрами и 'bind2nd' в моем вызове' find_if', должен ли он работать? – SunFlower

+0

Вам не нужно передавать его в качестве второго параметра. Вы можете использовать локальные переменные внутри lambdas, так как до тех пор, пока 'someID' находится в области видимости, вам хорошо идти. См. Эту статью о lambdas, чтобы узнать больше о захвате: http://msdn.microsoft.com/en-us/library/dd293603.aspx –

+0

Большое спасибо! Теперь понятно! – SunFlower

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