2009-05-28 5 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 : \ 프로그램 파일 \ 마이크로 소프트 비주얼 스튜디오 9.0 \ VC의 \는 \ 포함 유틸리티 (57) : 오류 C2664 : '표준 : :지도 < _Kty, _Ty> ::지도 (const를 표준 :: 이하 < _Ty> &) '매개 변수 1 변환 할 수 없습니다'표준 : CONST 쌍 < _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 = CONST CString을, 1> _Ty2 = 표준 :지도 1>]

========== 빌드> 1 컴파일되고 : 0 성공, 1 실패, 0 최신, 0 건너 뛰기 ==========

답변

3

다음과 같이 기능을 변경하십시오. 당신이 _DeparmentRecordvalue_type 형식 정의가 아니라 make_pair보다를 사용하는 경우

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 (Name, Value)는 쌍이지만 ...이어야합니다.

STL 오류는 진정한 고통이 될 수 있습니다. GCC의 최신 버전을 사용하면 오류 메시지가 훨씬 개선되지만 MSVC를 사용하고있는 것을 볼 수 있으므로 많은 도움이되지 않습니다.

+0

최신 MSVC를 사용하면 도움이됩니다. –

+0

그리고 STLFilt는 어떨까요? – xtofl

1

다른 답변 외에도 std :: make_pair는 std :: pair를 반환합니다. 컴파일러가 LPCWSTR에서 CString으로의 변환을 수행 할 것이라고 기대하지 마십시오.

1

은 다른 정답 이외에, 당신은 변환 문제를 방지 (그리고 가능성이 더 나은 오류 메시지를받을) 수 있습니다.

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

그리고 작은 점 : 비 로컬 이름에 밑줄을 사용하지 마십시오. 표준 라이브러리 용으로 예약되어 있습니다.