operator << defined in both module!!!
-
Hallo zusammen!
Mein Compiler bringt mir eine LinkerWarnung, aus der ich einfach nicht schlau werde. Ich hab schon alle Stellen, an denen ich den Schiebeoperator überladen habe aus dem Quellcode genommen, trotzdem taucht immer noch in etwa folgende Meldung auf: (und das nicht nur 1mal sondern für alle Module)
[Linker Warnung] Public symbol
'_STL::basic_ostream<char,_STL::char_traits<char>>& _STL::operator << (_STL::basic_ostream<char,_STL::char_traits<char>>&, const char*)'
defined in both module Class1.obj and Class2.objIch hab keinen blassen Schimmer, wo denn dieser Schiebeoperator mehrfach definiert sein soll! Ich hab ihn nur zweimal überladen und das war für die Fälle ofstream<<string und ifstream>>string. Nur die Implementierung hab ich schon wieder auskommentiert. An manchen Stellen benutze ich noch den Schiebeoperator für stringstreams. Ich überlade ihn aber nicht. Ich weiss wirklich nicht mehr weiter.
Kann mir vielleicht von Euch jemand auf die Sprünge helfen. Selbst wenn es nur eine Anmerkung ist, wär ich sehr dankbar!
Danke!
Grüße,
TS++
-
Liegen vielleicht noch alte objekt-files rum?
-
Hallo!
Ja, das ist möglich!
Meinst Du, es könnte wirklich an meinem überladenen Schiebeoperator liegen?
Grüße,
TS++
-
Endlich!
Ich bin draufgekommen, wo der Fehler lag. Nur da soll mir einer mal erklären, wie dieser Fehler zustande gekommen sein soll. Das glaubt einem kein Mensch!
Der Fehler lag offensichtlich nicht an meinen überladenen Schiebeoperatoren, sondern am stringstream!
Ursprünglich hatte ich in folgendem Funktionsobjekt mit SringStreams gearbeitet:
//hash.h: //------- #include <hash_map> struct hash<TVertex2> { size_t operator()(const TVertex2& obj) const { //Hier hatte ich ursprünglich mit StringStreams gearbeitet! } };
Nach dem Ersetzen der StringStream-Operationen durch ganz normale Char-Funktionen, wie gcvt(...), verschwanden die Linkerwarnungen. Da frag ich mich natürlich, wie kommt der Compiler bei einem Aufruf wie, einstream<<zahl, auf die Idee, dass ich den Schiebeoperator neu definiere und noch dazu überall, wo 'hash<TVertex2>' bekannt ist.
Da komm ich ehrlich gesagt nicht drauf.Was mir noch etwas merkwürdig erscheint, ist die Tatsache, dass ich offensichtlich den Quellcode zur HashCodeBerechnung in keine eigene Quellcodedatei schreiben darf. Sobald ich diesen in eine eigene Datei 'hash.cpp' ziehe, meldet mir der Compiler, dass der gefundene Operator '()' kein Element von hash<TVertex2> ist.
Ist mir ehrlich gesagt auch schleierhaft!Grüße,
TS++