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-Conversion

    Benutzerdefinierte 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-Conversion

    Benutzerdefinierte 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? 😕


Anmelden zum Antworten