003
19.01.2009, 23:21 Uhr
0xdeadbeef
Gott (Operator)
|
Das ist richtig, ja. Es wäre ja auch keine wirkliche Spezialisierung; sie wäre nach wie vor von einer Vorlage umgeben. Im Falle weiterer Spezialisierungen der umgebenden Klassenvorlage stellte sich die Frage, wozu die Spezialisierung denn eigentlich gehört.
Es ist kein Problem, etwas wie
C++: |
template<> template<> operator I1<char>::operator<int>() { ... }
|
oder
C++: |
template<> template<typename T> operator I1<char>::operator I1<T>() { ... }
|
zu schreiben, nur andersrum geht's halt nicht.
Unter diesem Gesichtspunkt, und weil Konversionsoperatoren eine recht haarige Sache sein können, würde ich mir an deiner Stelle übrigens überlegen, statt der Operatoren Konstruktoren bereitzustellen. Dann ließe sich der Konstruktor in I1<char> auf diese Weise spezialisieren, etwa so:
C++: |
#include <iostream> using namespace std;
template <class T> class I1
{ public: T i, j; I1(T a = 0, T b = 0): i(a), j(b){} ~I1(){}
template<typename U> I1(I1<U> const &); };
template<class T> template<class U> I1<T>::I1(I1<U> const &i1) : i(i1.i), j(i1.j) { }
template<> template<typename U> I1<char>::I1(I1<U> const &i1) : i(i1.i), j(i1.j) { cout << "char specialisation" << endl; }
int main() { I1 <int> var2(97, 99); cout << var2.i << ", " << var2.j << endl; I1 <char> var3(var2); cout << var3.i << ", " << var3.j << endl; return 0; }
|
-- Einfachheit ist Voraussetzung für Zuverlässigkeit. -- Edsger Wybe Dijkstra Dieser Post wurde am 19.01.2009 um 23:23 Uhr von 0xdeadbeef editiert. |