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.
-
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); }
-
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!!!