Nochmal: friend Funktion innerhalb einer Template-Klasse



  • Servus zusammen:

    Um einer Antwort zuvorzukommen: Ja, ich habe die Suche benutzt. Ich habe sogar folgenden Thread gefunden, der _genau_ mein Problem beschreibt, allerdings behebt dieser selbiges nicht:

    Bei diesem Code (kopiert aus dem besagten Thread) bekomme ich folgenden Fehler (Compiler: g++):

    13 C:\code\cpp\test.cpp declaration of `class T' 
    4 C:\code\cpp\test.cpp  shadows template parm `class T'
    
    #include <iostream>
    using namespace std;
    
    template <class T >
    class Foo
    {
    public:
        Foo(T value)
        {
            this->value = value;
        }
    
        template <class T>
        friend ostream &operator<<(ostream &out, const Foo<T> &o);
    private:
        T value;
    };
    
    template <class T>
    ostream &operator<<(ostream &out, const Foo<T> &o)
    {
        out<<o.value;
        return out;
    };
    
    int main()
    {
        cout<<"Hallo Welt!"<<endl;
    
        Foo <int> t(2);
        cout<<t<<endl;
    
        return 0;
    }
    

    Ich bin ziemlich ratlos... Wäre schön wenn mich jemand aufklären könnte 🙂

    Caipi



  • template <class NotNamedT>
        friend ostream &operator<<(ostream &out, const Foo<NotNamedT> &o);
    


  • finix schrieb:

    template <class NotNamedT>
        friend ostream &operator<<(ostream &out, const Foo<NotNamedT> &o);
    

    Super, das war es. Danke!

    Jedoch stellen sich bei mir jetzt die Fragen nach dem warum. Liegt das daran, dass die friend-Funktion im Prinzip nichts mit der eigentlichen Klasse zu tun hat und deswegen auch nicht mit dem gleichen Typ-Namen instantiiert werden kann? 😕
    Auch hier würde ich mich über eine Aufklärung sehr freuen.

    P.S.: Sorry, für meine verspätete Reaktion. War bis vorhin weg...

    Caipi



  • *push*



  • Caipi schrieb:

    Jedoch stellen sich bei mir jetzt die Fragen nach dem warum. Liegt das daran, dass die friend-Funktion im Prinzip nichts mit der eigentlichen Klasse zu tun hat und deswegen auch nicht mit dem gleichen Typ-Namen instantiiert werden kann?

    Das trifft es ungefähr ganz gut. (Obwohl ich mir nicht sicher bin was du mit dem von mir unterstrichenen Teil meinst.) Die Templateparameter T und NotT haben nichts miteinander zu tun.

    template <class T>
    class Foo
    {
    public:
      Foo(T value) : value(value) { }
    
      template <class NotT>
      friend NotT whatever( const NotT& p );
    
    private:
      T value;
    };
    
    template <class NotT>
    NotT whatever( const NotT& p )
    {
      Foo<int> bar(42);
      return (bar.value < 1000000) ? -p : p;
    }
    
    int main()
    {
      double x = whatever(3.0);
    }
    


  • finix schrieb:

    Caipi schrieb:

    Jedoch stellen sich bei mir jetzt die Fragen nach dem warum. Liegt das daran, dass die friend-Funktion im Prinzip nichts mit der eigentlichen Klasse zu tun hat und deswegen auch nicht mit dem gleichen Typ-Namen instantiiert werden kann?

    Das trifft es ungefähr ganz gut. (Obwohl ich mir nicht sicher bin was du mit dem von mir unterstrichenen Teil meinst.) Die Templateparameter T und NotT haben nichts miteinander zu tun.

    Soweit ich weiß wird eine Template-Klasse und deren Methoden mit dem übergebenen Typ (der in der Klasse mit dem Typ-Namen T angesprochen wird) instantiiert. Und da die entsprechende friend-Funktion im Prinzip nichts mit der eigentlichen Klasse (und diesem Typ) zu tun hat, kann sie nicht mit dem gleichen Typ-Namen (im Beispiel T) instantiiert werden. Sehe ich das richtig?

    Caipi



  • Machs doch nicht so kompliziert. Das Problem ist im Prinzip das selbe wie hier:

    int foo = 5;
    ...
    int foo = 10;
    


  • @all: Danke. Ich glaube jetzt hab ich es endlich verstanden.

    Caipi


Anmelden zum Antworten