[Template] Funktionsvorlage konnte nicht spezialisiert werde
-
Guten Abend,
gegeben ist folgenden Memberfunktiontemplate <typename T> Logging& Logging::operator <<(const T &Event) { std::fstream File; File.open(this->m_pfad.c_str(), std::ios::out | std::ios::app); if(File.is_open()) { File << Event; File.close(); } return *this; }Ruf ich nun den << operator so auf
int main() { Logging log; int i=15; log << i; return 0; }kommt folgende Fehlermeldung
1>f:\c++ - programme\sonstiges\logging\main.cpp(13) : error C2893: Funktionsvorlage 'class Logging &__thiscall Logging::operator <<(const T &)' konnte nicht spezialisiert werden Mit den folgenden Vorlagenargumenten: 'int' 1>f:\c++ - programme\sonstiges\logging\main.cpp(13) : error C2676: Binaerer Operator '<<' : 'class Logging' definiert diesen Operator oder eine Konvertierung in einen fuer den vordefinierten Operator geeigneten Typ nichtWodrann liegt das ?
-
Hi, das kommt mir irgendwie bekannt vor, da gabs doch schonmal nen Thread von dir

In deinem Code ist so kein Problem. Ich denke eher du hast deine Definition deiner Template-Memberfunktion nicht in der selben Datei wie die Klassendefinition.
Bei Templates kannst du nicht in .h und .cpp trennen. Dh Deklaration und Definition müssen in einer Übersetzungseinheit stehen. ( export beachten wir mal nicht
)Packe mal alles in die .h und probiere es nochmal aus ...
-
Die Klassen - und Template-Memberfunktion Definition befinden sich in der selben .h Datei.
-
Hmm, poste mal ein komplett kompilierbares Beispiel. Am besten die komplette .h.
Da ist nämlich kein Fehler ...
-
// // logging.h // #ifndef __LOGGING__ #define __LOGGING__ #include <string> #include <fstream> #include <iostream> class Logging { private: std::string m_pfad; public: template<typename T> Logging& operator <<(const T &Event); Logging(); ~Logging(); }; #endif template <typename T> Logging& Logging::operator <<(const T &Event) { std::fstream File; /* Anhängen der Log einträge */ File.open(this->m_pfad.c_str(), std::ios::out | std::ios::app); if(File.is_open()) { File << Event; File.close(); } return *this; } // // logging.cpp // #include "logging.h" Logging::Logging() { this->m_pfad = "LOG.txt"; std::fstream File; File.open(this->m_pfad.c_str(), std::ios::out); if(File.is_open()) { File << "Beginn:\n" <<std::endl; File.close(); } } Logging::~Logging() { } // // main.cpp // #include <iostream> #include "logging.h" int main() { Logging log; int i=15; log << i; return 0; }Hier ist das Beispiel, nur wird hier der oben genannte Fehler ausgegeben.
-
Alles sieht gut aus. Mach mal ein "Rebuild all".
-
Danke geht jetzt :p
komisch also im VS6 kommen die oben genannten Fehler, im VS2005 läuft es ohnen Probleme

-
iirc hats vs6 nicht so mit member-templates
-
camper schrieb:
iirc hats vs6 nicht so mit member-templates
VC 6 (SP5) unterstützt Membertemplates, deren Definition muss aber innerhalb der Klassendefinition geschehen.