explizite Spezialisierung von Template Funktionen
-
Hallo Leute,
Wofür braucht man die explizite Spezialisierung bei Templates?
Welchen praktischen Nutzen hat man gegenüber der impliziten Spezialisierung?
-
Meinst du
template<typename T> void foo(T t) {} int i; foo(i); //versus foo<int>(i);
Wenn ja:
es gibt situationen wo du einen anderen Typen willst.
zB könntest du
foo<double>(i);
aufrufen wollen...
Oder die Funktion hat 2 Parameter und du übergibst 2 variablen mit unterschiedlichen Typen...Oder die Funktion kann die Typen nicht herleiten:
template<typename T> T* create() { return new T(); }
-
Tschuldigung...
meine Instanzierung, nicht Spezialisierung
-
Ich glaube er meint eher sowas:
template int min<int> (int, int); //function template instantiation template class vector<string>; //class template explicit instantiation
Damit kannst Du sicherstellen, daß die entsprechende Funktion instantiiert wird und damit auch die Syntax vollständig geprüft wird, unabhängig davon, ob die Funktion nun benutzt wird oder nicht.
Außerdem gibt besteht die Möglichkeit damit das export-"Problem" zu umgehen. Man kann dann nur die Deklaration in den Header schreiben, die Definition in die cpp und die benötigten Instanziierungen in die cpp mit reinschreiben. Damit geht das Kompilieren möglicherweise deutlich schneller, dafür müssen alle Benutzungen des templates explizit in dessen Implementierung eingetragen werden. So oder so ähnlich geht das jedenfalls.MfG Jester
-
In diesem Fall würde ich einen Blick auf Instantiator werfen.
-
Ja, danke, ist mir auf jeden Fall mal geholfen.
Übrigens hab ich zudem folgendes Problem mit meinem Compiler (Visual C++):ich habe eine (nicht Template basierende) Klasse definiert, in der sich eine Template Funktion befindet, die ein Funktionsobjekt als Parameter übernehmen soll.
nach folgendem Muster:
class Muster
{
......public:
template <class T>
void Muster::func(T aFunc);
.......
};Das erstaunliche jetzt:
Möchte man die Funktiom instanzieren
Muster.func(Funktionsobjekt); //implizite Instanzierung
so wirft der Compiler eine Fehlermeldung, wenn die Funktion nicht inline definiert wurde.
Nur bei Inline klappt das Kompilieren !!!????leider konnte ich in der Literatur über so eine Konstellation noch nichts finden.
-
SliderMax schrieb:
so wirft der Compiler eine Fehlermeldung, wenn die Funktion nicht inline definiert wurde.
Nur bei Inline klappt das Kompilieren !!!????VC++6?
Der hat da n paar Bugs.
-
es ist nicht nur bei VC6 so, sondern auch bei neuen Versionen. Das kann man umgehen, indem man die Übersetzungseinheit, wo die Template-Funktion definiert, direkt includiert:
#include "test.cpp"
allerdings ist für solche Zwecke das export-Schlüsselwort gedacht, das momentan nur von wenigen Compilern unterstützt wird.
-
Shlo schrieb:
es ist nicht nur bei VC6 so, sondern auch bei neuen Versionen. Das kann man umgehen, indem man die Übersetzungseinheit, wo die Template-Funktion definiert, direkt includiert.
Ne, es geht darum, dass der VC++ IIRC folgenden code nicht schluckt:
template<typename T> struct A { void foo(); }; template<typename T> void A::foo() { }
Das er kein export kann, ist wohl bei nahezu jedem compiler so.