Template-Argument kann nicht hergeleitet werden



  • Guten Tag,
    Hab das Problem das der Compiler das Template-Argument nicht herleiten kann, ich aber nicht weiss warum, bzw. ich den Wald vor lauter Bäumen nicht seh :p
    Hier mal das der Quellcode in abgespäckter Version

    //
    //	Logging Header
    //
    
    #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
    
    //
    //	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()
    {
    }
    
    template <typename T> Logging& Logging::operator <<(const T &cEvent)
    {
        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 << "Log: " << cEvent;
    		File.close();
        }
        return *this;
    }
    
    //
    // main.cpp
    //
    
    #include <iostream>
    #include "logging.h"
    
    int main()
    {
    	Logging log;
    	int i=15;
    	log << "Zahl: " << i << std::endl;
    	return 0;
    }
    

    Ich erhalte folgende Fehlermeldungen vom Compiler

    1>f:\c++ - programme\sonstiges\logging\main.cpp(13) : error C2914: "Logging::operator <<": template-Argument kann nicht hergeleitet werden, da das Funktionsargument mehrdeutig ist.
    1>f:\c++ - programme\sonstiges\logging\main.cpp(13) : error C2676: Binärer Operator '<<': 'Logging' definiert diesen Operator oder eine Konvertierung in einen für den vordefinierten Operator geeigneten Typ nicht
    

    Und er nehbt mir folgende Zeile hervor.

    log << "Zahl: " << i << std::endl;
    

    Nun weiss ich aber nicht was dadrann flasch ist.



  • vielleicht solltest du zunächst mal herausfiltern, welcher der drei Operator-Aufrufe überhaupt als mehrdeutig eingestuft wird 😉 (ich würde ja darauf tippen, daß endl überladen ist).

    PS: Dir ist klar, daß jeder Operator-Aufruf sein eigenes "Log:" schreiben wird? (d.h. du bekommst die Zeile "Log: Zahl: Log: 15 Log: " als Ausgabe)



  • Das std::endl ist das Problem.

    Das ist ein Funktionszeiger; siehe BS,C++PL §21.4.6.

    Grüsse

    *this



  • Danke es lag an std::endl.
    Nun hab ich aber das Problem das er es nicht auflösen kann

    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: class Logging & __thiscall Logging::operator<<(int const &)" (??6Logging@@QAEAAV0@ABH@Z)
    main.obj : error LNK2001: Nichtaufgeloestes externes Symbol "public: class Logging & __thiscall Logging::operator<<(char const (&)[7])" (??6Logging@@QAEAAV0@AAY06$$CBD@Z)
    

    Das Projekt neuerstellen was dabei meistens hilft bring auch kein Erfolg 😞

    @CStoll
    Danke für den Hinweiss hatte ich ganz übersehen 😃



  • Schieb die Implementierung des operators von der .cpp in die .h Datei.



  • Also irgendwie steh ich mit der Funktion auf Kriegsfuss :p

    Hab die Implementierung verschoben, jetzt löst er das auch auf aber es gibt erneut Fehler 😞

    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:
            'char [7]'
    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 nicht
    


  • Du hast irgendwo ein Array char[7] an deinen Logging::operator<< uebergeben. Das Template gibt den blauaeugig weiter an std::ostream& operator<<(std::ostream&, char[7]), weil du es so verlangst - leider gibts den aber nicht. du kannst kein ganzes array ueber operator << beispielsweise an cout uebergeben.

    (uebrigens nett, was fuer vokalaufreihungen man mit ner englischen Tastatur bewerkstelligen muss - blauaeugig)



  • Ich ruf das so auf

    log << "Zahl: " << i << std::endl;
    

    und da sieht der die "Zahl: " als char Array an, aber auch wenn ich nur i ausgeben will kommt die Meldung, aber nur mit int.



  • CStoll schrieb:

    (ich würde ja darauf tippen, daß endl überladen ist).

    Was bedeutet Überladen bzgl. endl ?



  • templäd schrieb:

    CStoll schrieb:

    (ich würde ja darauf tippen, daß endl überladen ist).

    Was bedeutet Überladen bzgl. endl ?

    Das bedeutet, daß es zwei Funktionen namens 'endl' gibt und der Compiler nicht entscheiden kann, welche davon die richtige ist (endl ist normalerweise eine Funktion 'ostream& endl(ostream&);' - und der Stream-Operator ist für dazu passende Funktionspointer überladen).



  • Hab das ganze Wochenende rum getüftel aber kein Lösung gefunden, deshalb meld ich mich noch mal hier.

    Also wenn ich den << operator nur mit int aufrufe also so

    log << i;
    

    Kommt folgende Fehlermeldung, an der ich verzweifel.

    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 nicht
    

    Implementier ich den << operator einmal für std::string und einem für int kann ich ihn so aufrufen

    log << "Zahl: " << i;
    

    Jetzt ist die Frage warum funktioniert das nicht mit der Template Funktion.


Anmelden zum Antworten