Ich stieß auf dieses Problem mit Templat-Klassen. Hier ist eine allgemeinere Lösung, die ich benutzen musste:
template class <T>
class myClass
{
int myField;
// Helper function accessing my fields
void toString(std::ostream&) const;
// Friend means operator<< can use private variables
// It needs to be declared as a template, but T is taken
template <class U>
friend std::ostream& operator<<(std::ostream&, const myClass<U> &);
}
// Operator is a non-member and global, so it's not myClass<U>::operator<<()
// Because of how C++ implements templates the function must be
// fully declared in the header for the linker to resolve it :(
template <class U>
std::ostream& operator<<(std::ostream& os, const myClass<U> & obj)
{
obj.toString(os);
return os;
}
Jetzt: * My toString() Funktion kann nicht inline sein, wenn es in cpp versteckt werden soll. * Sie sind mit etwas Code in der Kopfzeile stecken, ich konnte es nicht loswerden. * Der Operator ruft die Methode toString() auf, die nicht inline ist.
Der Operator < < kann in der Friend-Klausel oder außerhalb der Klasse deklariert werden. Beide Optionen sind hässlich.:(
Vielleicht bin ich etwas Missverständnis oder fehlt, sondern nur voraus erklärt der Betreiber Vorlage nicht in gcc einen Anknüpfungs
Das funktioniert auch.
template class <T>
class myClass
{
int myField;
// Helper function accessing my fields
void toString(std::ostream&) const;
// For some reason this requires using T, and not U as above
friend std::ostream& operator<<(std::ostream&, const myClass<T> &)
{
obj.toString(os);
return os;
}
}
Ich glaube, Sie können auch Vermeiden Sie Templating-Probleme, die Deklarationen in Headern erzwingen, wenn Sie eine übergeordnete Klasse verwenden, die den Operator < < nicht implementiert, und verwenden Sie eine virtuelle toString() - Methode.
Außerdem deklariert er es als eine Friend-Funktion und definiert es als ich mber-Funktion. – asaelr