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 для вас.

Другие вопросы по тегам