Posiadam klasę bazową zbliżoną do poniższego kodu. Próbuję przeciążać < < do użycia z cout. Jednak g ++ mówi:Deklaracja przyjaciela deklaruje funkcję bez szablonu
base.h:24: warning: friend declaration ‘std::ostream& operator<<(std::ostream&, Base<T>*)’ declares a non-template function
base.h:24: warning: (if this is not what you intended, make sure the function template has already been declared and add <> after the function name here) -Wno-non-template-friend disables this warning
Próbowałem dodanie <> po < < w deklaracji klasy/prototypu. Jednak otrzymuję go does not match any template declaration
. Starałem się, aby definicja operatora była w pełni szablonowana (co chcę), ale udało mi się ją uruchomić tylko z następującym kodem, z ręcznym tworzeniem operatora.
base.h
template <typename T>
class Base {
public:
friend ostream& operator << (ostream &out, Base<T> *e);
};
base.cpp
ostream& operator<< (ostream &out, Base<int> *e) {
out << e->data;
return out;
}
Chcę po prostu mieć to lub podobne w nagłówku, base.h:
template <typename T>
class Base {
public:
friend ostream& operator << (ostream &out, Base<T> *e);
};
template <typename T>
ostream& operator<< (ostream &out, Base<T> *e) {
out << e->data;
return out;
}
mam przeczytaj gdzie indziej online, w którym wstawianie <> pomiędzy < < i() w prototypie powinno napraw to, ale tak nie jest. Czy mogę to zrobić w jednym szablonie funkcji?
To dokładnie problem rozwiązany przez Dan Saks' [ "nowych przyjaciół" idiom] (http://en.wikibooks.org/wiki/More_C % 2B% 2B_Idioms/Making_New_Friends). _ (Przepraszam za spóźniony komentarz.) _ –