Заполнение std :: map с помощью std :: transform (ошибка: невозможно вывести аргумент) - PullRequest
2 голосов
/ 07 мая 2011

Я пытаюсь заполнить std :: map с помощью std :: transform.Следующий код компилируется без ошибки:

std::set<std::wstring> in; // "in" is filled with data
std::map<std::wstring, unsigned> out;

std::transform(in.begin(), in.end()
,   boost::counting_iterator<unsigned>(0)
,   std::inserter(out, out.end())
,   [] (std::wstring _str, unsigned _val) { return std::make_pair(_str, _val); }
);

Но если я заменю строку

,   [] (std::wstring _str, unsigned _val) { return std::make_pair(_str, _val); }

на

,   std::make_pair<std::wstring, unsigned>

или

,   std::ptr_fun(std::make_pair<std::wstring, unsigned>)

Iполучить ошибки:

foo.cpp(327): error C2784: '_OutTy *std::transform(_InIt1,_InIt1,_InTy (&)[_InSize],_OutTy (&)[_OutSize],_Fn2)' : could not deduce template argument for '_InTy (&)[_InSize]' from 'boost::counting_iterator<Incrementable>'
      with
      [
          Incrementable=unsigned int
      ]
      C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(1293) : see declaration of 'std::transform'
foo.cpp(327): error C2784: '_OutTy *std::transform(_InIt1,_InIt1,_InIt2,_OutTy (&)[_OutSize],_Fn2)' : could not deduce template argument for '_OutTy (&)[_OutSize]' from 'std::insert_iterator<_Container>'
      with
      [
          _Container=std::map<std::wstring,unsigned int>
      ]
      C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(1279) : see declaration of 'std::transform'
foo.cpp(327): error C2784: '_OutIt std::transform(_InIt1,_InIt1,_InTy (&)[_InSize],_OutIt,_Fn2)' : could not deduce template argument for '_InTy (&)[_InSize]' from 'boost::counting_iterator<Incrementable>'
      with
      [
          Incrementable=unsigned int
      ]
      C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\include\algorithm(1267) : see declaration of 'std::transform'
foo.cpp(327): error C2914: 'std::transform' : cannot deduce template argument as function argument is ambiguous

и так далее ... Пожалуйста, объясните, в чем проблема с компиляцией?

ОБНОВЛЕНИЕ: Спасибо за ответы.Я понял, что это ошибка MSVC2010.Кстати линия

&std::make_pair<const std::wstring&, const unsigned&>

вызывает такую ​​же ошибку

Ответы [ 2 ]

7 голосов
/ 07 мая 2011

Это ошибка в реализации библиотеки Visual C ++. Следующая программа демонстрирует проблему:

#include <utility>

int main()
{
    &std::make_pair<int, int>;
};

Эта программа выдает ошибку:

error C2568: 'identifier' : unable to resolve function overload

В спецификации языка C ++ make_pair не является перегруженной функцией. Реализация библиотеки Visual C ++ 2010 включает в себя четыре перегрузки, принимающие различные комбинации ссылок lvalue и rvalue.

Хотя реализация стандартной библиотеки C ++ допускает добавление перегрузок для функций-членов, запрещено добавлять перегрузки для функций, не являющихся членами, поэтому это ошибка.

Об ошибке было сообщено и она будет исправлена ​​в следующей версии Visual C ++ . Однако, как отмечает STL в резолюции об этой ошибке, вам необходимо задать аргументы шаблона для std::make_pair lvalue ссылок:

&std::make_pair<const std::wstring&, const unsigned&>
3 голосов
/ 07 мая 2011

g ++ 4.4.5 компилирует его без ошибок. Кажется, дефект Visual Studio 10 .

...