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: \ program files \ microsoft visual studio 9.0 \ vc \ include \ utility (57): ошибка C2664: 'std:: map<_Kty, _Ty>:: map (const std:: less<_Ty> &)': невозможно преобразовать параметр 1 из 'const std:: pair<_Ty1, _Ty2>' в 'const std:: less<_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:: pair<_Ty1, _Ty2>' в 'const std:: less<_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> [ 1> _Ty1 = const CString, 1> _Ty2 = std:: map 1>]
========== Построение: 0 выполнено, 1 не выполнено, 0 обновлено, 0 пропущено ===========
5 ответов
Измените функцию следующим образом.
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)) ;
}
Вы пытаетесь вставить pair< section, pair<...> >
в карту, которая принимает pair< section, map<...> >
,
std::make_pair(Name, Value) - это пара... но это должна быть карта.
Ошибки STL могут быть настоящей болью. Использование самой последней версии GCC может помочь, его сообщения об ошибках значительно улучшены, но я вижу, что вы используете MSVC, так что это вам не сильно поможет.
В дополнение к другим правильным ответам вы избежите проблем с конверсией (и, вероятно, получите лучшие сообщения об ошибках), если будете использовать _DeparmentRecord
"s 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;
}
И маленький момент: не используйте начальные подчеркивания для нелокальных имен - они зарезервированы для стандартной библиотеки.
В дополнение к другим ответам std::make_pair вернет std::pair. Не ожидайте, что компилятор выполнит преобразование из LPCWSTR в CString для вас.