friend-Syntax für Template-Operatoren
-
Wie sieht die korrekte friend-Syntax aus? Meine hier ist ja anscheinend falsch.
template<typename T> class foo; template<typename T> class bar; template<typename T, typename U> foo<T> operator<< (bar<T>& obj, U const& val); template<typename T> class foo { template<typename U> friend foo<T> operator<< <T, U>(bar<T>& obj, U const& val);//?? template<typename U> friend foo<T> bar<T>::template operator= <U> (U const& val);//?? }; template<typename T> class bar { public: template<typename U> foo<T> operator= (U const& val); };
-
Eine Templatedeklaration (template-Schlüsselwort verwendet), die auch eine Templateargumentliste enthält (der Teil in den Spitzen Klammern) bezieht sich immer auf eine Spezialisierung eines Templates (partiell oder explizit).
Template-friends sind speziell.
friend-Templatedeklarationen dürfen keine (partiellen oder explizite) Spezialisierungen deklarieren. In beiden Deklarationen (sowohl op << als auch op=) muss also (mindestens) entweder das Templateschlüsselwort oder die Templateargumentliste entfernt werden.Weiter:
template<typename U> friend foo<T> operator<< (bar<T>& obj, U const& val);ist eine zulässige Deklaration, passt aber nicht zu der vorherigen Deklaration des op<<, bezieht sich also auf ein anderes Template. Falls der Operator gleich inline in dieser friend-Deklaration definiert werden kann, besteht kein Problem. Soll die Definition erst später passieren, muss in den sauren Apfel gebissen werden: die friend-Deklaration ist dann umfassender als eigentlich notwendig:
template<typename V, typename U> friend foo<V> operator<< (bar<V>& obj, U const& val);op= bereitet in dieser Hinsicht keine Probleme:
template<typename U> friend foo<T> bar<T>::operator=(U const& val);