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 nichtUnd 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 kannmain.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 nichtImplementier 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.