Próbuję przeciążać operatora < < jako znajomego, aby klasy szablonu Pair, ale wciąż otrzymuję ostrzeżenie kompilatora mówiącPrzeciążenie operatora przyjaciel << dla klasy szablonu
friend declaration std::ostream& operator<<(ostream& out, Pair<T,U>& v) declares a non template function
na ten kod:
friend ostream& operator<<(ostream&, Pair<T,U>&);
daje drugie ostrzeżenie jako zalecenie mówiąc
if this is not what you intended, make sure the function template has already been declared and add <> after the function name here
Oto definicja funkcji: i tutaj jest cała klasa.
template <class T, class U>
class Pair{
public:
Pair(T v1, U v2) : val1(v1), val2(v2){}
~Pair(){}
Pair& operator=(const Pair&);
friend ostream& operator<<(ostream&, Pair<T,U>&);
private:
T val1;
U val2;
};
Nie byłem pewien, co wyciągnąć z ostrzeżenia o zaleceniu, poza tym, że być może muszę umieścić gdzieś w deklaracji przyjaciela. Czy ktokolwiek zna odpowiednią składnię tego? Dzięki.
+1 To jest rzeczywiście to, co kompilator narzeka. Druga odpowiedź dotyczy problemu z obejściem: zamiast informowania kompilatora o tym, że przyjaciel jest specjalizacją szablonu, tworzy on niewymiarową funkcję << operatora dla podanych typów. –
Zgadzam się z Davidem; jest to najlepsze rozwiązanie w zakresie najlepszej praktyki i dobrego programowania. – Andry
Wow, dodatkowe '<>' jest łatwe do przegapienia! – Nick