-operator<< <T, TSIZE>
zu verweisen, wie Sie das tun, was eine Template-Spezialisierung ist, muss eine Erklärung der primären Vorlage sichtbar sein. Der Reihe nach benötigt operator<<
eine Deklaration von MyTest
, weil es als ein Parameter erscheint.
// Declare MyTest because operator<< needs it
template<class T, unsigned int TSIZE> class MyTest;
// Declare primary template
template<class T, unsigned int TSIZE>
inline std::ostream& operator<<(std::ostream& lhs, const MyText<T, TSIZE>& rhs);
template<class T, unsigned int TSIZE> class MyTest
{
// Specialization MyTest<T, TSIZE> only declares
// specialization operator<< <T, TSIZE> as friend
// Note that you can just use '<>' to designate the specialization,
// template parameters are deduced from the argument list in this case
inline friend std::ostream& operator<< <> (std::ostream &lhs, const MyTest<T, TSIZE> &rhs);
};
Die Definition, die Sie haben, sollte diesen Deklarationen entsprechen. Beachten Sie, dass es sich bei operator<<
um eine Vorlage handelt, deren Definition aller Wahrscheinlichkeit nach in der Kopfzeile enthalten sein sollte.
Eine Alternative, die weniger Arbeit erfordert, wenn es darum geht, alle diese preemptive Erklärungen zu schreiben, ist für MyTest<T, TSIZE>
die ganze Vorlage als Freund zu erklären, nicht nur die Spezialisierung, die MyTest<T, TSIZE>
nimmt.
// in MyTest definition
template<typename U, unsigned USIZE>
inline friend std::ostream& operator<<(std::ostream& lhs, const MyTest<U, USIZE>& rhs);
Die Definition Sie auch so passen eine Erklärung haben sollte (den Namen der Template-Parameter hat keinen Einfluss auf passende Erklärungen und Definition).
Aus Gründen der Vollständigkeit, werde ich erwähnen, dass, wenn es um den Freund einer Klasse-Vorlage kommt eine Alternative in der Klasse Template-Definition zu definieren ist. Dies definiert eine Nicht-Template-Friend-Funktion, die für jede Spezialisierung eindeutig ist.
// in MyTest definition
friend std::ostream& operator<<(std::ostream& lhs, MyTest const& rhs)
{ /* implementation */ }
Es ist unmöglich, solche Funktionen zu beziehen (z &ns::operator<<
nicht, im Gegensatz zu den anderen Optionen nicht funktioniert), und sie sind nur über ADL gefunden.
Was genau meinst du mit „nicht funktioniert“ ... Compiler-Fehler? Welche Fehler? Erste Rate ... "Freund" gehört nicht in die .cpp-Version. –