DLL und Template-Spezialisierung
-
Hi,
in meiner DLL-Bibliothek will ich eine Spezialisierung einer Template-Klasse explizit instanziieren, damit der Benutzer die Implementierung nicht sieht.
Für normale Templateklassen funktioniert das ja ohne Probleme, wenn ich in einer .cpp Datei das Template instanziere:
template class __declspec(dllexport) List<int>;
Nun habe ich aber für meine Liste eine Spezialisierung für string geschrieben:
template <> class List<string> { (...) };
Wenn ich diese dann wie oben instanzieren will, erhalte ich aber folgende Fehlermeldung von VS 2010:
#include "detail/StringList.h" template class __declspec(dllexport) List<string>;
error C2950: 'List<string>' : cannot explicitly instantiate an explicit specialization
Funktioniert eine explizitie Instanzierung nicht mit Spezialisierungen? Wie kann ich es dann trotzdem erreichen, dass die List<string> Instanz aus der DLL gelinkt wird ohne das ich den Code den User zur Verfügung stellen muss?
Danke!
-
Du leitest es ab?
-
Eine explizite Spezialisierung eines Klassentemplates ist eine Klasse und kein Template. Entsprechend ist eine Definition einer solchen Spezialisierung keine Templatedefinition.
Die explizite Instantiierung einer (zuvor deklarierten) expliziten Spezialisierung hat keinen Effekt.
Wichtig ist hier nur, dass die explizite Spezialisierung auch im Header deklariert wird, andernfalls würde durch den Nutzercode eine implizite Instantiierung der Klassendefinition aus dem Primärtemplate erfolgen, was die ODR verletzen würde.