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);
    };
    

  • Mod

    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);
    

Anmelden zum Antworten