2009-05-28 16 views
1

Ich versuche multimap zum ersten Mal zu verwenden, aber meine App wird nicht kompilieren. TIA Paul ..std :: multimap kompilieren Fehler

// file dept.h 

typedef std::multimap <CString, std::map< CString, CString> > _DeparmentRecord; // also tryied replacing CString with LPCWSTR 

_DeparmentRecord DeparmentRecord; 


// file dept.cpp 

DWORD CIni::AddNameValue(LPCWSTR Section, LPCWSTR Name, LPCWSTR Value) 
{ 

DeparmentRecord.insert(std::make_pair (Section, std::make_pair(Name, Value))); <-- error here 

} 

c: \ Programme \ Microsoft Visual Studio 9.0 \ vc \ include \ Dienstprogramm (57): Fehler C2664: ‚std :: map < _Kty, _Ty> :: Karte (const std :: weniger < _Ty> &)‘: kann nicht Parameter 1 von konvertieren 'const std :: pair < _Ty1, _Ty2>' auf 'const std :: weniger < _Ty> &'

1> mit 1> [ 1> _Kty = CString, 1> _Ty = CString 1>] 1> und 1> [ 1> _Ty1 = LPCWSTR, 1> _Ty2 = LPCWSTR 1>] 1> und 1> [ 1> _Ty = CString 1>] 1> Grund: kann nicht von ‚const std konvertieren :: pair < _Ty1, _Ty2>‘auf 'const std :: weniger < _Ty> 1> mit 1> [ 1> _Ty1 = LPCWSTR, 1> _Ty2 = LPCWSTR 1>] 1> und 1> [ 1> _Ty = CString 1>] 1> Kein benutzerdefinierter Konvertierungsoperator verfügbar, der diese Konvertierung durchführen kann, oder der Operator kann nicht sein 1> c: \ dev \ projekte \ migrator \ jobbuilder \ jobbuilder \ ini.cpp (55): siehe Verweis auf die Funktion template instantiation 'std :: pair < _Ty1, _Ty2> :: pair> (const std :: pair > &)‘ 1> mit 1> [ 1> _Ty1 = konst CString, 1> _Ty2 = std :: map 1>]

========== Build compiliert werden : 0 erfolgreich, 1 fehlgeschlagen, 0 aktuell, 0 übersprungen ==========

Antwort

3

Ändern Sie die Funktion wie folgt.

DWORD AddNameValue(LPCWSTR Section, LPCWSTR Name, LPCWSTR Value) 
{ 
    std::map<CString, CString> aTemp; 
    aTemp.insert(std::make_pair (Name, Value)); 
    DeparmentRecord.insert(std::make_pair (Section, aTemp)) ; 
} 
+0

Hinweis: Sie werden _ den Eintrag für Abschnitt ersetzen, nicht aktualisieren. – xtofl

+0

Aber DepartmentRecord ist eine Multimap. Also würde kein neuer Eintrag hinzugefügt werden? – AngryWhenHungry

3

Sie versuchen, eine pair< section, pair<...> > in eine Karte einzufügen, die pair< section, map<...> > dauert.

2

std :: make_pair (Name, Wert) ist ein Paar ... aber es sollte eine Karte sein.

STL-Fehler können ein echter Schmerz sein. Die Verwendung der neuesten Version von GCC kann helfen, die Fehlermeldungen sind sehr verbessert, aber ich sehe, dass Sie MSVC verwenden, so dass Sie nicht viel helfen können.

+0

Mit den neuesten MSVC hilft auch, wissen Sie. –

+0

Und was ist mit STLFilt – xtofl

1

Zusätzlich zu den anderen Antworten gibt std :: make_pair ein std :: -Paar zurück. Erwarten Sie nicht, dass der Compiler die Konvertierung von LPCWSTR in CString für Sie durchführt.

1

Zusätzlich zu den anderen richtigen Antworten werden Sie Konvertierungsprobleme vermeiden (und bekommen wahrscheinlich bessere Fehlermeldungen), wenn Sie _DeparmentRecord verwenden ‚s value_type typedef statt make_pair.

DWORD AddNameValue(LPCWSTR Section, LPCWSTR Name, LPCWSTR Value) 
{ 
    _DeparmentRecord::iterator i = 
     DeparmentRecord.insert(_DeparmentRecord::value_type(Section, v)).first; 
    i->second[Name] = Value; 
} 

Und ein kleiner Punkt: Verwenden Sie keine führenden Unterstrichen für nicht-lokale Namen - sie sind für die Standardbibliothek reserviert.