std :: multimap ошибки компиляции

Я впервые пытаюсь использовать multimap, но мое приложение не компилируется. TIA Paul ..

// 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 пропущено ==========


person Canacourse    schedule 28.05.2009    source источник


Ответы (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)) ;
}
person Shino C G    schedule 28.05.2009
comment
Примечание: вы замените запись для раздела, а не обновите ее. - person xtofl; 28.05.2009
comment
Но DepartmentRecord - это мульти-карта. Так разве не будет добавлена ​​новая запись? - person AngryWhenHungry; 28.05.2009

Вы пытаетесь вставить pair< section, pair<...> > в карту, которая принимает pair< section, map<...> >.

person xtofl    schedule 28.05.2009

std :: make_pair (Name, Value) - это пара ... но это должна быть карта.

Ошибки STL могут быть настоящей болью. Использование самой последней версии GCC может помочь, его сообщения об ошибках значительно улучшены, но я вижу, что вы используете MSVC, так что это вам не очень помогает.

person Dietrich Epp    schedule 28.05.2009
comment
Вы знаете, что использование самой последней версии MSVC тоже помогает. - person Dave Van den Eynde; 28.05.2009

В дополнение к другим ответам std :: make_pair вернет std :: pair. Не ожидайте, что компилятор выполнит преобразование из LPCWSTR в CString за вас.

person Dave Van den Eynde    schedule 28.05.2009

В дополнение к другим правильным ответам вы избежите проблем с преобразованием (и, вероятно, получите более качественные сообщения об ошибках), если будете использовать _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;
}

И небольшой момент: не используйте начальные подчеркивания для нелокальных имен - они зарезервированы для стандартной библиотеки.

person James Hopkin    schedule 28.05.2009