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!


Anmelden zum Antworten