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
Antwort
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; }
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
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
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
}
- 1. Funktion Array zurückgeben ohne definierte explizite Form
- 2. F # explizite Spiel vs Funktion Syntax
- 3. Explizite Rekursion in Haskell
- 4. Generics explizite Konvertierung
- 5. mit explizite Schnittstelle Implementierung
- 6. Explizite Freundesspezialisierung der Template-Funktion in der Klassenvorlage
- 7. Explizite Funktion Template-Spezialisierung wählt die falsche Spezialisierung
- 8. reduzieren, oder explizite Rekursion?
- 9. explizite Spezialisierung für Funktionsvorlage C++
- 10. Wie überladene explizite Konvertierungsoperatoren verwenden?
- 11. EventListener oder explizite Endlosschleife
- 12. "Einschränkungen für explizite Schnittstellenimplementierung ..."
- 13. Explizite Umwandlung existiert C#
- 14. explizite warten nicht richtig
- 15. Wie eine explizite Absicht
- 16. Abhängigkeitsinjektion und explizite Schnittstellenimplementierung
- 17. Teilausführung ohne explizite Definition
- 18. Perl erfordert explizite Paketname
- 19. Explizite Schnittstellenimplementierung in VB.NET
- 20. Explizite Multicore-C# -Anwendungen
- 21. var vs explizite Deklaration
- 22. entfernen explizite Unix-Dateiberechtigungen
- 23. Explizite Verwendung von LambdaMetafactory
- 24. Warum explizite Schnittstellenimplementierung?
- 25. Haskell Unterstrich vs. explizite Variable
- 26. Wie funktioniert printf() ohne explizite Argumentanzahl
- 27. Explizite Export freigegebener Bibliotheksfunktionen in Linux
- 28. Explizite Initialisierung von Struktur-/Klassenmitgliedern
- 29. Explizite Sperren vs implizite Sperren
- 30. C# explizite Initialisierung für Enum
Wenn es etwas ganz anderes, tun Sie es nicht eine Überlastung machen (auch bekannt als Template-Spezialisierung);) – delnan
@delnan: Der einzige Unterschied besteht darin, dass einer von ihnen einen Verweis, der andere einen Wert als Implementierungsdetail zurückgibt. – Puppy
Ist diese Frage wirklich C++ 0x spezifisch? –