Wie kann man diese Template-Methode aufrufen?



  • Hi,

    wollte nur mal rein informativ wissen, wie man einen solchen "falschen" Kopierkonstruktor aufrufen kann:

    template <class T, class x>
    class P
    {
       // Wie kann man den aufrufen?
       template <class R>
       P(const P&){}
    };
    


  • bin mir nicht sicher ob ich das Richtig verstandan habe, du rufst es halt wie ne normale Funktion auf:

    P<double, int> Nase;
    P<double, int>& n;
    Nase.copy<std::string>(n);
    


  • Naja, P(const P&) ist ja nun ein Kopierkonstruktor, und in diesem Fall auch eine Member-Template-Funktion. Ich habe nur bisher nicht herausfinden könne, wie man den aufrufen kann.

    Ich habe probiert (wenn wir noch annehmen, P hätte einen Standardkonstruktor):

    P<int, double> a;
    
    P<int, double> b = a; // geht nicht
    P<int, double> *c = new P<int, double><int>(a);  // geht auch nicht
    

    Mir ist also einfach nicht klar, wie man den Kontruktor aufruft (syntaktisch).

    Glamdrink schrieb:

    bin mir nicht sicher ob ich das Richtig verstandan habe, du rufst es halt wie ne normale Funktion auf:

    P<double, int> Nase;
    P<double, int>& n;
    Nase.copy<std::string>(n);
    

    Naja, zuerst hat P gar keinen Standardkonstruktor, außerdem musst du Referenzen initialisieren. Ich weiß also nicht ganz genau, was du mit diesem Code meinst.



  • Wenn du nur einen Kopierkonstruktor brauchst ist das "template <class R>" natürlich unnötig. Ich gehe davon aus das du dich einfach vertippt hast:
    [cpp]
    template <class R>
    P(const R&){} // R statt P
    [/cpp]
    Dann ganz einfach aufrufen:

    int    my_int = 0;
    float  my_float = 0.f;
    foo    my_foo(bar);
    
    // ...
    
    P<int, double> a(my_int);
    P<int, double> b(my_float);
    P<int, double> c(my_foo);
    


  • finix schrieb:

    Wenn du nur einen Kopierkonstruktor brauchst ist das "template <class R>" natürlich unnötig. Ich gehe davon aus das du dich einfach vertippt hast:

    Nein war kein Tippfehler 😉 Ganz zufällig stieß ich auf diese Methodendeklaration, die wunderbar kompiliert wird. Nur ich finde einfach keinen Weg, diesen Konstruktor aufzurufen. Ich wollte nur mal rein interesse-halber wissen, wie ein Aufruf dieses Konstruktors denn aussehen muss.



  • Na dann:

    P<double, int> Name<int>(Referenz_auf_int);
    


  • Glamdrink schrieb:

    Na dann:

    P<double, int> Name<int>(Referenz_auf_int);
    

    du hast das problem nicht verstanden.

    es ist schon so, wie es im ersten post steht:

    template <class R>
    P(const P&){}
    

    es ging darum, wie man bei einem copy ctor einen template parameter angeben kann, der sich aus den parametern nicht herleiten lässt.

    @topic dies ist leider meinem wissensstand nach nicht möglich, da auch der code von glamdrink nicht kompiliert wird.



  • otze schrieb:

    @topic dies ist leider meinem wissensstand nach nicht möglich, da auch der code von glamdrink nicht kompiliert wird.

    Korrekt. Explizite Templateargument-Spezifikation ist bei Konstruktoren nicht möglich. Aus dem einfachen Grund, da man Konstruktoren ja nichtmal explizit aufrufen kann. Einige Compiler liefern in dieser Situation deshalb auch gleich eine Warnung.

    otze schrieb:

    es ging darum, wie man bei einem copy ctor einen template parameter angeben kann

    Nur als kleiner Hinweis: ein Template-Ctor ist niemals ein Copy-Ctor.


Anmelden zum Antworten