Template Friends
-
Wieso klapt folgender code nicht:
template<class B,int c=6> class A{ public: A(){} A(int){} template<class B2,int c2> friend bool operator==(const A<B2,c2>&,const A<B2,c2>&); }; template<class B,int c> bool operator==(const A<B,c>&,const A<B,c>&){ return false; } int main(){ A<char*> a; a==5; }
Wenn ich nun aber:
a==5;
durch
a==A<char*>(5);
Diese Konvertirung sollte doch eigentlich implizit geschehen, oder?
PS:Ich nutz den DJGPP Port von GCC 3.3.2
-
Das glaube ich nicht, denn wie soll der int Template-Parameter hergeleitet werden?
-
Diese Konvertirung sollte doch eigentlich implizit geschehen, oder?
Nope. Bei der Auflösung von Templatefunktionen sind nur drei Konvertierungen erlaubt:
1. lvalue-Conversion (lvalue-to-rvalue, array-to-pointer, function-to-pointer)
2. Qualification-Conversion
3. Derived-To-Base-ConversionBenutzerdefinierte Konvertierungen, die hier nötig wären, werden hingegen nur bei Argumenten für "normale" Funktionen durchgeführt.
Sprich: Wäre dein op== eine normale Funktion (kein Template) und würde zwei A<char*> erwarten, dann wäre der Aufruf ok und 5 würde implizit in ein A<char*> konvertiert werden.
-
HumeSikkins schrieb:
Diese Konvertirung sollte doch eigentlich implizit geschehen, oder?
Nope. Bei der Auflösung von Templatefunktionen sind nur drei Konvertierungen erlaubt:
1. lvalue-Conversion (lvalue-to-rvalue, array-to-pointer, function-to-pointer)
2. Qualification-Conversion
3. Derived-To-Base-ConversionBenutzerdefinierte Konvertierungen, die hier nötig wären, werden hingegen nur bei Argumenten für "normale" Funktionen durchgeführt.
Sprich: Wäre dein op== eine normale Funktion (kein Template) und würde zwei A<char*> erwarten, dann wäre der Aufruf ok und 5 würde implizit in ein A<char*> konvertiert werden.OK, dann gehts nicht
. Wieso ist das denn eigentlich bei normalen Funktionen erlaubt und bei Templates nicht?