[gelöst-peinlich][gcc-error] template - friend inline
-
Folgende Klasse verursacht mit dem gcc 3.4 probleme (cl und icpc10.0 nicht)
namespace UbKeys { //nested class template< typename T1, typename T2 = T1 > class Key2 { public: Key2(const T1& t1, const T2& t2) : t1(t1), t2(t2) { } /*==========================================================*/ Key2& operator=(const Key2& srcKey) { if(this == &srcKey ) return *this; t1 = srcKey.t1; t2 = srcKey.t2; return *this; } /*==========================================================*/ T1 getT1() const { return t1; } T2 getT2() const { return t2; } friend inline bool operator<(const Key2& lhsKey,const Key2& rhsKey) { if( lhsKey.t1 < rhsKey.t1 ) return true; if( lhsKey.t1 > rhsKey.t1 ) return false; if( lhsKey.t2 < rhsKey.t2 ) return true; return false; } friend inline bool operator==(const Key2& lhsKey, const Key2& rhsKey) { if(lhsKey.t1 != rhsKey.t1 ) return false; if(lhsKey.t2 != rhsKey.t2 ) return false; return true; } friend inline bool operator!=(const Key2& lhsKey, const Key2& rhsKey) { /*L 74*/ return return !(lhsKey == rhsKey); } friend inline std::ostream& operator << (std::ostream& os, const Key2& key) { os<<"Key2<"<<typeid(T1)<<","<<typeid(T2)<<">,("<<key.t1<<","<<key.t2<<")"; return os; } private: T1 t1; T2 t2; }; }fehler
UbKeys.h: In function
bool UbKeys::operator!=(const UbKeys::Key2<T1, T2>&,const UbKeys::Key2<T1, T2>&)': L 74: error: expected primary-expression before "return" L 74: error: expected;' before "return"liegt es daran, dass der compiler nicht mehr vernuenftig die template parameter zuweisen kann? muss ich die friend inline methode noch mit template... versehen?
und wa sist eine primary expression?
-
Versuche zunächst mal, das doppelte "return" zu bereinigen.

-
Ich würde sagen, das liegt einfach daran, daß du dort zwei "return" hintereinander geschrieben hast

-
*lol* verdammt...
das hab ich echt nicht gesehen. das ist mir jetzt aber echt peinlich...
BTW kann man eigentlich auch
friend inline bool operator!=(const Key2<T1,T2>& lhsKey, const Key2<T1,T2>& rhsKey)schreiben? würde das Sinn machen
-
In der Klassendefinition brauchst du die Template-Parameter deines Typs nicht anzugeben (und afaik würde der Compiler sogar implizit das 'inline' ergänzen), außerhalb der Klasse wäre das 'friend' verboten (und ist btw auch überflüssig, da op!= keine internen Daten benötigt).
PS: In deinem Fall könntest du op< und op== auch als Memberfunktionen anlegen.
PPS: Hast du schon mal von std::pair<> gehört?
-
klar hab ich von pair gehört
nutze sie auch fleissig obwohl ich Tuples bevorzuge.
hier habe ich auch nur UbKey2 aufgelistet... es gibt UbKey2/3/4/5 und da werden pairs unübersichtlich und die tuples bei uns durch die val<1>(tuple) syntax etwas unübersichtlich... dennoch danke für den tipp