In der Regel für meine Template-Klassen, schließe ich Deklarationen in eine .hpp
Datei und Vorlage Implementierungscode in eine .t.hpp
Datei. Ich instanziiert explizit die Klasse in einer .cpp
Datei:Vorlagenoperator << explizite Instanziierung und Header
template class MyClass<AnotherClass>;
dessen Objektcode wird in einer Bibliothek setzen.
Das Problem ist, dass, wenn ich versuche, das Objekt mit operator<<
, zu drucken, die in der .hpp
Datei deklarierte und in der .t.hpp
Datei wie folgt definiert:
template<class T>
std::ostream& operator<<(std::ostream& os, const MyClass<T>& c)
{
os << "Hello, I am being output.";
return os;
}
ich eine Linker Fehlermeldung, dass das richtige Symbol ist nicht definiert.
Ich verstehe, dass dies liegt daran, dass diese Template-Funktion nicht explizit instanziiert wird, wenn die Klasse ist. Gibt es eine Möglichkeit, um diese andere zu umgehen als die .t.hpp
Datei zu jeder Zeit, die ich operator<<
auf der Klasse verwenden möchten, oder den Vorlagencode in die .hpp
Datei zu verschieben? Kann ich den Funktionscode explizit instanziieren?
+1. Ich habe gerade den nicht-abgeleiteten Fall hinzugefügt und sehe dich bereits aktualisiert, um das aufzunehmen ... Grr! :) –
Danke! Genau das habe ich gebraucht. Ich wusste nicht, dass Vorlagenfunktionen explizit instanziiert werden könnten. –