Probs mit templates und << Operator
-
Wenn ich den folgenden Code in VC++ compilieren will, kommen hässliche Fehler. In C++ Builder z.B. funktioniert es ohne Einwände. Was ist da wohl falsch? Irgendwas mit der STL scheint bei VC++ nicht zu stimmen.
class Logger { private: ostream *m_ostreamCOUT; ostream *m_ostreamFile; public: Logger(bool bUseCOUT, string filename); ~Logger(); template <typename T> Logger& operator<< (T); }; .. .. template <typename T> Logger& Logger::operator<< (T var) { if (m_ostreamCOUT) *m_ostreamCOUT << var; if (m_ostreamFile) *m_ostreamFile << var; return *this; }
Nun bei der Anwendung happerts beim Kompilieren:
int main () { Logger strm(true, "c:\\temp\\out.txt"); strm << "adf" << 23434 << hex << 67899; return (0); }
Es kommen folgende Fehler beim Compilieren (betrifft den Teil im main()):
Kompilierung läuft... logger.cpp logger.cpp(65) : error C2893: Funktionsvorlage 'class Logger &__thiscall Logger ::operator <<(T)' konnte nicht spezialisiert werden Mit den folgenden Vorlagenargumenten: 'char *' logger.cpp(65) : error C2676: Binaerer Operator '<<' : 'class Logger' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht logger.cpp(66) : error C2893: Funktionsvorlage 'class Logger &__thiscall Logger::operator <<(T)' konnte nicht spezialisiert werden Mit den folgenden Vorlagenargumenten: 'char *' logger.cpp(66) : error C2676: Binaerer Operator '<<' : 'class Logger' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht Fehler beim Ausführen von cl.exe.
Und wie gesagt, in Borland C++ Builder gehts ohne Probleme. Was ist wohl hier im VC++ das Problem??
Habe übrigens ne normale Konsolen Applikation ohne MFC gemacht.
Vielen Dank für die Hilfe!!- Adrian
-
Schreib das lieber ins C++ Forum.
In diesem Bereich wirst du keine Hilfe finden.
-
Hmm, ich denk eben dass es VC++ spezifisch ist. Und daher hab ichs hier gepostet. Wenn ein Admin es verschieben will, dann soll er. Ich weiss nicht...
Übrigens meine ich mit dem Titel "Probs mit templates und << Operator" tatsächlich, dass dads Template das Problem macht. Wenn ich kein Template nehem, sondern z.B. nen Operator << für char* mache, klappts.
UND EBEN: MIT BC++ GEHTS SO ODER SO. NUR MIT VC NICHT. DESHALB DAS POSTING HIER.- Adrian
-
Es scheint tatsächlich so, als dass der VC++ 6 keine Member Function Templates unterstützt. Stimmt denn das?? Kann das sein?? Ist doch eigentlich sehr grundlegend. Kann jemand darüber was aussagen?
- Adrian
-
Hat niemand Hinweise? - Unterstützt VC++ 6 effektiv keine member function templates??
- Adrian
-
Try moving the definition of operator<< inside the class declaration.
http://www.experts-exchange.com/Programming/Programming_Languages/Cplusplus/Q_20430865.html
-
You mean moving outside? - It is already inside!
Und ja, das habe ich auch gemacht, und so gehts.
VC++ 6 ist definitiv zu alt, bin jetzt auf VC 2003 umgestiegen. -> Nun gehen auch die Memberfunction Templates...- Adrian
-
Ich habe es so gemeint ...
class Logger{ Logger& operator<< (T var); }; template <typename T> Logger& Logger::operator<< (T var){ ... }
gibt die Fehler! Aber ...
class Logger{ Logger& operator<< (T var){ ... } };
gehts ohne probleme.
Ich weiss nicht warum!