friend deklaration in Klassen Templates?



  • Halloechen, ich hab folgendes geschrieben:

    template <class ValueImp>
    class Value : public ValueImp
    {
    // [...]
    friend Value<ValueImp> operator+(const Value<ValueImp>& lhs, const Value<ValueImp>& rhs);
    // usw.  
    };
    
    // implementation...
    template <class ValueImp>
    Value<ValueImp> operator+ (const Value<ValueImp>& lhs, const Value<ValueImp>& rhs)
    { Value<ValueImp> result(lhs); result+=rhs; return result;}
    

    Nun gibt mir der Compiler eine Warnung:

    value.hpp:36: warning: friend declaration `Value<ValueImp> operator+(const
       Value<ValueImp>&, const Value<ValueImp>&)' declares a non-template function
    

    Sobald ich fuer eien Spezialisierung den operator+ bemuehen will, kommt vom compiler

    In function `main':
    : undefined reference to `operator+(Value<IntValueImp> const&, Value<IntValueImp> const&)'
    

    Wie dekariere ich die friend definition richtig?



  • Hi,
    diese Frage taucht in letzter Zeit ja immer häufiger aus.
    Lösung: http://c-plusplus.net/forum/viewtopic-var-p-is-1293870.html#1293870



  • Naja, ne wirkliche Lösung für die Geschichte mit den Friend-Deklarationen hab ich dem zwar icht entnehmen können, aber ich hab den Hinweis bekommen, dass ich operator+ garnicht als Friend deklarieren muss, da er nur auf den (public) operator+= zugreift und auf keinerlei private members. Wundert mich nur, dass er mir da die Fehlermeldung rausgibt - vielleicht ein Fehler an anderer Stelle. Danke für den link



  • pumuckl schrieb:

    Naja, ne wirkliche Lösung für die Geschichte mit den Friend-Deklarationen hab ich dem zwar icht entnehmen können, aber ich hab den Hinweis bekommen, dass ich operator+ garnicht als Friend deklarieren muss, da er nur auf den (public) operator+= zugreift und auf keinerlei private members. Wundert mich nur, dass er mir da die Fehlermeldung rausgibt - vielleicht ein Fehler an anderer Stelle. Danke für den link

    Die Lösung steht im Link ;), verfolge den Link in meinem Link, dann kommt ne genauere Antwort darauf ...


Anmelden zum Antworten