2013-10-02 4 views
1

У меня есть класс шаблона с тремя типами шаблонов (в основном в паре с еще одним членом), и я не могу получить перегрузку сравнения к работе:C++: шаблон класса с оператором сравнения перегрузки

Заголовок:

template<typename FirstType, typename SecondType, typename ThirdType> 
class Triple 
{ 
public: 
    Triple(FirstType f, SecondType s, ThirdType t) : var1(f), var2(s), var3(t) 
    {} 
... 
private: 
    FirstType var1; 
    SecondType var2; 
    ThirdType var3; 
}; 


template<typename F1, typename S1, typename T1, typename F2, typename S2, typename T2> 
bool operator==(const Triple<F1,S1,T1>& one, const Triple<F2,S2,T2>& other) 
{ 
    return true; //just for testing 
} 


template<typename F1, typename S1, typename T1, typename F2, typename S2, typename T2> 
bool testFunc(const Triple<F1,S1,T1>& one, const Triple<F2,S2,T2>& other) 
{ 
    return true; //just for testing 
} 

главная:

Triple<int, int, int> asdf(1, 1, 2); 
Triple<int, int, int> qwer(1, 21, 2); 
cout << asfd == qwer;   //doesn't work 
cout << testFunc(asfd, qwer); //works 

Я получаю следующее сообщение об ошибке с помощью оператора ==:

binary '==' : no operator found which takes a right-hand operand of type 'Triple<FirstType,SecondType,ThirdType>' 

Почему testFunc работает, но перегрузка оператора нет? Обратите внимание, что я хочу включить возможность сравнения двух разных типов Triples, так как кто-то может захотеть сравнить ints с удвоениями, например. Я также попытался реализовать функцию сравнения внутри класса с одинаковыми результатами.

+0

BTW, вы должны попробовать использовать 'зЬй :: tuple' вместо того, чтобы создать свой собственный класс для него. – Nawaz

ответ

5

<< имеет более высокий приоритет, чем ==. Это означает, что ваше выражение обрабатывается как

(cout << asdf) == qwer; 

Просто добавьте скобки, чтобы исправить эту

cout << (asdf == qwer); 
+0

+1. О, это верно. – Nawaz

+1

Глупый меня. Если компилятор сказал, что «оператор не найден, который принимает ostream как левый операнд, а Triple - как правый операнд», я бы сразу узнал. Я обвиняю компилятор. :) – SnowFatal

+0

@SnowFatal Это всегда моя первая мысль, когда я вижу потоковое ('<<' and '>>') и другие операторы, смешанные вместе, и он не компилируется – SirGuy

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