operator= bei template-klassen



  • hallo,
    ich habe eine Klasse CTest mit zwei Template-Argumente, wobei der zweite relativ unwichtig ist (eigentlich nur ne Trais-Klasse).

    template<class A, class T> CTest
    {
    public:
    A m_a;
    
    //...
    }
    

    Nun möchte ich einen operator= anbieten, welcher den m_a-Wert eines CTest<A, IrgendeineTraitsKlasse> in eine CTest<A, IrgendeineANDERETraitsKlasse> kopiert.
    Dazu sollte aber auch operator= für CTest<A, IrgendeineTraitsKlasse> und CTest<A, IrgendeineTraitsKlasse> funktionieren.

    Ich habe es erstmal so gelöst:

    template<class A, class T> CTest
    {
    public:
    A m_a;
    
    template<class T_> void operator=(CTest<A,T_>& Test_)
    {
    m_a=Test_.m_a;
    }
    
    //...
    }
    

    Das klappt soweit auch wunderbar, nur leider nimmt VC++ für den operator= mit der gleichen Traits-Klasse den selbst generierten operator=.

    CTest<int,IntTrait1> A(0);
    CTest<int,IntTrait2> B(0);
    A=B; //geht
    CTest<int,IntTrait1> C(0);
    A=C; //geht nicht; Compiler nimmt selbst gebauten operator=
    


  • Wenn 2 Funktionen in Frage kommen, wird bei der Entscheidung
    die "bessere" genommen. In diesem Fall ist F1 besser als F2, wenn

    - ...
    - F1 is a non-template function and F2 is a template function specialization, ...

    (C++ Standard 13.3.3, S. 220)

    Daher wird der implizite op= als besser betrachtet.
    D.h. für den gewünschten Zweck müsste op= für <A,T> explizit
    definiert werden.


  • Mod

    Ein Templatezuweisungsoperator ist niemals ein Kopierzuweisungsoperator (ganz analog zum Copy-ctor). Den musst du also in jedem Falle noch deklarieren. Im Zweifel kannst du ihn ja auf die Templatevariante zurückführen:

    void operator=(CTest& Test_)
    {
        return operator=<T>(Test);
    }
    

  • Mod

    Helpie schrieb:

    D.h. für den gewünschten Zweck müsste op= für <A,T> explizit
    definiert werden.

    Die Existenz einer besonderen Spezialisierung ist unerheblich. Für Zwecke der Überladungsauflösung kommt es stets nur auf die Signatur das Primärtemplates an. Ein normaler Copy-Operator= existiert immer - im Zweifel durch den Compiler deklariert und wird im Regelfall gegenüber einer Templatedeklaration vorgezogen werden (abgesehen von Sondernfällen wie const-Overloads).



  • Camper, ich liebe dich. Danke.

    PS: lol. Glückwunsch zum 2000 post, der, Oh wunder, ein Doppelpost ist!!!


Anmelden zum Antworten