std :: multimap ошибки компиляции - PullRequest
1 голос
/ 28 мая 2009

Я пытаюсь использовать мультикарту в первый раз, но мое приложение не скомпилируется. ТИА Пол ..

// 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 ]

3 голосов
/ 28 мая 2009

Измените функцию следующим образом.

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)) ;
}
3 голосов
/ 28 мая 2009

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

2 голосов
/ 28 мая 2009

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

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

1 голос
/ 28 мая 2009

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

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

1 голос
/ 28 мая 2009

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

...