Template-Methoden-Spezialisierung
Verfasst: Mi Mai 09, 2012 11:00 am
Moin!
Folgendes Beispiel:
Hier werden zwei Refs erzeugt, eins mit einem Double, das andere mit einem int. Für den Konstruktor für ref<int> gibt es eine Spezialisierung. Startet man das Programm kommt folgendes heraus:
Soweit, so gewollt.
Nun brauche ich aber zwei Template-Parameter, wobei ich mich auf einen spezialisieren möchte:
Das hier kann ich nichtmals mehr kompilieren.
g++:
Visual Studio 2010:
Wie erkläre ich es meinem Compiler(n)?
Ich möchte nicht die komplette Template ref<> spezialisieren, da ich eigentlich nur eine einzige Methode (nichtmals den Konstruktor) spezialisieren muss.
Folgendes Beispiel:
Code: Alles auswählen
#include <stdio.h>
template<typename T>
class ref
{
public:
T * Reference;
ref( T & reference );
};
template<typename T>
ref<T>::ref( T & reference )
: Reference( &reference )
{
printf( "Standard\n" );
}
template<>
ref<int>::ref( int & reference )
: Reference( &reference )
{
printf( "int-Spezialisierung\n" );
}
int main()
{
double d;
int i;
ref<double> rdouble(d);
ref<int> rint(i);
return 0;
}
Code: Alles auswählen
Standard
int-Spezialisierung
Nun brauche ich aber zwei Template-Parameter, wobei ich mich auf einen spezialisieren möchte:
Code: Alles auswählen
#include <stdio.h>
template<typename T, typename U>
class ref
{ // Zeile 5
public:
T * Reference;
U * URef;
ref( T & reference, U & uref ); // Zeile 10
};
template< typename T, typename U >
ref<T,U>::ref( T & reference, U & uref )
: Reference( &reference )
, URef( &uref )
{
printf( "Standard\n" );
}
template< typename U >
ref<int, U>::ref( int & reference, U & uref ) // Zeile 23
: Reference( &reference )
, URef( &uref )
{
printf( "int\n" );
} // Zeile 28
int main()
{
double d1, d2, di;
int i;
ref< double, double > dref( d1, d2 );
ref< int , double > iref( i, di );
return 0;
}
g++:
Code: Alles auswählen
uref2.cpp:23: error: invalid use of incomplete type 'class ref<int, U>'
uref2.cpp:5: error: declaration of 'class ref<int, U>'
Code: Alles auswählen
1> uref2.cpp(28): error C2244: 'ref<T,U>::ref': Keine Übereinstimmung für Funktionsdefinition mit vorhandener Deklaration gefunden
1> uref2.cpp(10): Siehe Deklaration von 'ref<T,U>::ref'
1> Definition
1> 'ref<int,U>::ref(int &,U &)'
1> Vorhandene Deklarationen
1> 'ref<T,U>::ref(T &,U &)'
Ich möchte nicht die komplette Template ref<> spezialisieren, da ich eigentlich nur eine einzige Methode (nichtmals den Konstruktor) spezialisieren muss.