Ich muss die Vorlagenelementfunktion für einen Typ spezialisieren (sagen wir doppelt ). Es funktioniert gut, während die Klasse X
selbst keine Vorlagenklasse ist, aber wenn ich sie als Vorlage erstelle, gibt GCC Fehler bei der Kompilierung aus.
#include <iostream>
#include <cmath>
template <class C> class X
{
public:
template <class T> void get_as();
};
template <class C>
void X<C>::get_as<double>()
{
}
int main()
{
X<int> x;
x.get_as();
}
Hier ist die Fehlermeldung
source.cpp:11:27: error: template-id
'get_as<double>' in declaration of primary template
source.cpp:11:6: error: prototype for
'void X<C>::get_as()' does not match any in class 'X<C>'
source.cpp:7:35: error: candidate is:
template<class C> template<class T> void X::get_as()
Wie kann ich das beheben und was ist das Problem hier?
Danke im Voraus.
c++
templates
gcc
specialization
Ledokol
quelle
quelle
Antworten:
So funktioniert das nicht. Sie müssten Folgendes sagen, aber es ist nicht korrekt
Explizit spezialisierte Mitglieder müssen ihre umgebenden Klassenvorlagen ebenfalls explizit spezialisiert haben. Sie müssen also Folgendes sagen, für das sich das Mitglied nur spezialisieren würde
X<int>
.Wenn Sie die umgebende Vorlage nicht spezialisiert haben möchten, haben Sie mehrere Möglichkeiten. Ich bevorzuge Überladungen
quelle
type<>
Wrapper? Konnte eine Umwandlung einer 0 in einen Zeiger vom TypT
nicht den Trick machen? Ich denke, es ist nicht so elegant ...template<typename T> void get_as(T*); void get_as(double*);
und zu übergeben(T*)0
.Wenn man es benutzen kann, können
std::enable_if
wir uns auf SFINAE verlassen (Substitutionsfehler sind kein Fehler)das würde so funktionieren (siehe LIVE ):
Das Hässliche ist, dass bei all diesen enable_ifs nur eine Spezialisierung für den Compiler verfügbar sein muss, da sonst ein Disambiguierungsfehler auftritt. Deshalb benötigt das Standardverhalten "get as T" auch eine Freigabe, wenn.
quelle