2010-12-29 13 views
0

Ich dachte, dass Template-Spezialisierungen völlig unabhängige Entitäten waren und alles haben konnten, was sie wollten. Aber VC++ hat mir einen Fehler gemeldet, als ich den Rückgabetyp einer Spezialisierung, die sich vom Rückgabetyp der ursprünglichen Vorlage unterscheidet, gemacht habe. Ist das wirklich Standard? Ich habe das Problem einfach gelöst, indem ich den Funktionskörper in eine statische Klasse umgeändert habe.Explizite Funktion Template-Spezialisierung

+0

Wenn es etwas ganz anderes, tun Sie es nicht eine Überlastung machen (auch bekannt als Template-Spezialisierung);) – delnan

+0

@delnan: Der einzige Unterschied besteht darin, dass einer von ihnen einen Verweis, der andere einen Wert als Implementierungsdetail zurückgibt. – Puppy

+1

Ist diese Frage wirklich C++ 0x spezifisch? –

Antwort

0

Funktion Spezialisierung ist seltsam und fast nicht existent. Es ist möglich, eine Funktion vollständig zu spezialisieren, wobei alle Typen beibehalten werden, d. H. Sie stellen eine benutzerdefinierte Implementierung einer Spezialisierung der vorhandenen Funktion bereit. Sie können eine Vorlagenfunktion nicht teilweise spezialisieren.

Es ist wahrscheinlich, dass das, was Sie versuchen, also zu tun mit Überlastung erreicht werden.

template <typename T> T foo(T arg) { return T(); } 
float foo(int arg) { return 1.f; } 
+0

Außer ich nehme keine Argumente. Ich habe mich voll auf meine Funktion spezialisiert, ich war nur überrascht, dass meine vollständige Spezifikation keinen separaten Rückgabetyp haben konnte. – Puppy

+0

Vollständige Spezialisierung ist nicht erlaubt, einen der Typen für Funktionen zu ändern. Und wenn Sie keine Argumente haben, wird das Überladen Sie auch nicht speichern. Beachten Sie, dass eine statische Elementfunktion einer Vorlagenklasse völlig anders ist (weshalb sie funktioniert) - Sie spezialisieren die Klasse anstelle der Funktion. – zeuxcg

1

Es gibt keine Funktion Schablonen-Teil Spezialisierung, da gibt es Funktionen Überlastung (und Funktionsschablonen jedoch Funktion Überlastung ist viel begrenzter als Template-Spezialisierung, also was Sie normalerweise tun, ist zurück auf Klassenvorlage Spezialisierungen fallen:

template< typename R, typename T > 
struct foo_impl { 
    static R foo(T) 
    { 
    // ... 
    return R(); // blah 
    } 
}; 

template< typename T > 
struct foo_impl<void,T> { 
    static void foo(T) 
    { 
    // ... 
    } 
}; 

template< typename R, typename T > 
R foo(T obj); 
{ 
    return foo_impl<R,T>::foo(obj); // fine even if R is void 
} 
Verwandte Themen