[VC++ 2003] Probleme mit std::map



  • Hallo zusammen!

    Ich habe ein Problem, wenn ich std::map verwende. Ich habe eine Klasse geschrieben, die Ini-Dateien liest/schreibt. In dieser Klasse inifile habe ich ein paar typedefs, um mir die Schreibarbeit zu sparen. Wenn ich nun aber von diesen typedefs eine Member-Variable anlege, geht nichts mehr und ich bekomme den Linker-Error LNK2005.

    Ich hab hier im Forum schon die Suche genutzt und die ganzen Tipps ausprobiert, aber nichts hilft. Ich habe das Problem jetzt auf diesen Teil des Projekts zurückverfolgt und verstehe es überhaupt nicht.

    Hier mal meine Klasse.

    class inifile
    {
    	protected:
          //die erwähnten typedefs
    	typedef map<string, string> map_type;
    	typedef map<string, map<string, string> > inidata_type;
    	typedef map<string, string>::const_iterator key_iterator;
    	typedef map<string, map<string, string> >::const_iterator section_iterator;
    
    	private:
    	string       filename;
    	fstream      *ini;
    	string       errMsg;
          // Kommentiere ich diese beiden Zeilen aus läuft alles wunderbar!?
    	map_type     errMap;
    	inidata_type iniData;
    
    	void readIniData();
    
    	public:
          ...
    };
    

    Ich sitze hier jetzt schon 3 Stunden dran und komme einfach nicht dahinter. Vielleicht wisst ihr ja was noch ich machen könnte?!

    Edit: Auch wenn ich std::map ohne typedefs also direkt nutze, das gleiche Problem!



  • +push+

    Hat keiner 'nen Hinweis?



  • Aber so recht verstehe ich es nicht. Hier ist doch MFC!?! Also warum nicht CString? Warum nicht CArrray? Nur der Vollständigkeit halber GetPrivateProfileSTring und WrietPrivateProfileString machen recht gute Arbeit beim lesen und schreiben in IniFiles.

    Aber vielleicht willst auch nur üben, dann ist es einleuchtend. Helfen kann ich dir aber nicht



  • DaDings schrieb:

    Hier ist doch MFC!?! Also warum nicht CString? Warum nicht CArrray? Nur der Vollständigkeit halber GetPrivateProfileSTring und WrietPrivateProfileString machen recht gute Arbeit beim lesen und schreiben in IniFiles.

    Ist mir schon klar. Aber ich wollte soweit es geht eben die Möglichkeiten nutzen, die der Standard bietet. So habe ich wenigstens einen Teil unabhängig und kann ihn auch in anderen Projekten außerhalb des VC++ verwenden. (davon mal abgesehen, finde ich std::string etc. komfortabler) 🙂



  • DaDings hat eigentlich recht.

    VC++ liefert aber sehr gute Fehlermeldungen. Wäre hilfrei diese mal zu posten oder genau durchzulesen.



  • Wie schon geschrieben, hab ich den Linker Error LNK2005.

    Linker Output schrieb:

    nafxcw.lib(afxmem.obj) : error LNK2005: "void __cdecl operator delete(void *)" (??3@YAXPAX@Z) already defined in LIBCMT.lib(delete.obj)
    E:\AWE\MasterChat v4\Release\MasterChat v4.exe : fatal error LNK1169: one or more multiply defined symbols found

    Im Forum hab ich schon danach gesucht und auch einiges gefunden, geholfen hat es allerdings nicht...



  • MSDN sagt:

    [Linker Tools Error LNK2005]

    Symbol bereits in Objekt definiert

    Das angegebene Symbol, das in seiner ergänzten Form dargestellt wird, wurde mehrfach definiert.

    Mögliche Ursachen

    Versehentliche Verknüpfung sowohl mit der Singlethread- als auch mit der Multithreadbibliothek. Stellen Sie sicher, dass die Anwendungsprojektdatei nur geeignete Bibliotheken einliest und dass Bibliotheken anderer Hersteller über entsprechend erstellte Singlethread- oder Multithreadversionen verfügen.
    Die Kombination statischer und dynamischer Bibliotheken bei gleichzeitiger Verwendung von /clr.
    Das Symbol ist eine Paketfunktion (wird durch die Kompilierung mit /Gy erstellt) und befindet sich in mehr als einer Datei, es wurde jedoch zwischen den Kompilierungen geändert. Kompilieren Sie alle Dateien neu, die Symbol enthalten.
    Das Symbol wurde in zwei Memberobjekten in verschiedenen Bibliotheken unterschiedlich definiert, und beide Memberobjekte wurden verwendet.
    Ein absolutes Symbol wurde zweimal definiert, in jeder Definition mit einem anderen Wert.
    In einer Headerdatei wurde eine Variable deklariert und definiert. Folgende Lösungen sind möglich:
    Deklarieren Sie die Variable in der H-Datei: extern BOOL MyBool; nehmen Sie dann Zuweisungen in einer C- oder CPP-Datei vor: BOOL MyBool = FALSE;.
    Deklarieren Sie die Variable als static.
    Deklarieren Sie die Variable als selectany.



  • Häufigste ursache ist eine -lib, die mit anderen Einstellungen für die C Runtime Library übersetzt wurde als die EXE.





  • fehler schon behoben?



  • Nein leider noch nicht. Ich bekomms nicht hin. Alle Tips bringen es irgendwie nicht. Ich weiß auch nicht mehr weiter. Ich werd das Projekt einfach noch mal neu aufziehen. Aber trotzem danke für die Hilfe!

    Wenn ich nochmal das Problem habe, weiß ich ja jetzt zu genüge was ich machen muss 🙂


Anmelden zum Antworten