2009-05-28 11 views
1

初めてマルチマップを使用しようとしていますが、私のアプリケーションはコンパイルされません。 TIAポール..std :: multimapコンパイルエラー

// 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:\プログラムファイルは、MicrosoftのVisual Studio 9.0 \ VCの\を\は\ユーティリティ(57)が含まれます:エラーC2664:「STD ::マップ< _Kty、_Ty> ::マップ(のconstのstd _Ty> &)< ::以下」:からパラメータ1を変換することはできません 'CONSTのstd ::ペア< _Ty1、_Ty2> CONST STD' に '::以下< _Ty> &'

1> 1> [ 1> _Kty = CString、 1> _Ty = CString 1>] 1> 1> 1> _Ty1 = LPCWSTR、 1> _Ty2 = LPCWSTR 1>] 1>及び 1> [ 1> _Ty = CStringの 1>] 1>理由:CONST STD」から変換することはできません::対< _Ty1、_Ty2>」 'へのconstのstd ::以下< _Ty>' 1>と 1> [ 1> _Ty1 = LPCWSTR、 1> _Ty2 = LPCWSTR 1>] 1>及び 1> [ 1> _Ty = CString 1>] 1>この変換を実行できるユーザー定義変換演算子はありません。または、演算子を使用できません。 1> c:¥dev¥projects¥migrator¥jobbuilder¥jobbuilder¥ini.cpp(55):関数テンプレートのインスタンス化の参照を参照してください 'std :: pair < _Ty1、_Ty2> :: pair>(const std :: pair > &)は」 1> [ 1> _Ty1 =一定のCString、 1> _Ty2 = STD ::マップ 1>]

==========ビルドで> 1コンパイルされています:0成功、1失敗、0最新、0スキップ

答えて

3

以下のように機能を変更してください。他の正解に加えて

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

注:セクションのエントリは_replace_、更新しません。 – xtofl

+0

しかしDepartmentRecordはマルチマップです。だから新しいエントリーは追加されませんか? – AngryWhenHungry

3

pair< section, map<...> >のマップにpair< section, pair<...> >を挿入しようとしています。

2

std :: make_pair(名前、値)はペアですが、マップでなければなりません。

STLエラーは真の痛みになります。 GCCの最新バージョンを使用するとエラーメッセージが大幅に改善されますが、MSVCを使用していることがわかりますので、あまり役に立ちません。

+0

最新のMSVCを使用すると、わかります。 –

+0

そしてSTLFiltはどうですか? – xtofl

1

他の回答に加えて、std :: make_pairはstd :: pairを返します。コンパイラがLPCWSTRからCStringへの変換を実行することは期待しないでください。

1

あなたは_DeparmentRecord年代value_typeのtypedefではなく、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; 
} 

小さな点:非ローカル名には先頭のアンダースコアを使用しないでください。標準のライブラリ用に予約されています。

関連する問題