Ich habe eine Basisklasse, die dem folgenden Code ähnlich ist. Ich versuche, < < zu überladen, um mit cout zu verwenden. jedoch g ++ sagt:Friend-Deklaration deklariert eine Nicht-Template-Funktion
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
Ich habe versucht, das Hinzufügen <> nach < < in der Klassendeklaration/Prototyp. Aber dann bekomme ich es does not match any template declaration
. Ich habe versucht, die Operatordefinition vollständig templated (was ich will), aber ich konnte es nur mit dem folgenden Code arbeiten, mit dem Operator manuell instanziiert.
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;
}
Ich möchte nur diese oder ähnliche haben im Header, 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;
}
Ich habe Lesen Sie an anderer Stelle online, dass <> zwischen < < und() im Prototyp sollte behebe das, aber das tut es nicht. Kann ich das in eine einzelne Funktionsvorlage bekommen?
Das ist genau das Problem von Dan Saks' gelöst [ "Neue Freunde" Idiom] (http://en.wikibooks.org/wiki/More_C % 2B% 2B_Idioms/Making_New_Friends). _ (Sorry für den späten Kommentar.) _ –