2

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>)

エラーが発生します:

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&>

同じエラーが発生します

4

2 に答える 2

7

これは、VisualC++ライブラリの実装におけるバグです。次のプログラムは、この問題を示しています。

#include <utility>

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

このプログラムはエラーを生成します:

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

C ++言語仕様でmake_pairは、はオーバーロードされた関数ではありません。Visual C ++ 2010ライブラリの実装には、左辺値と右辺値の参照のさまざまな組み合わせをとる4つのオーバーロードが含まれています。

C ++標準ライブラリの実装では、メンバー関数にオーバーロードを追加できますが、非メンバー関数にオーバーロードを追加することは許可されていないため、これはバグです。

このバグは報告されており、VisualC++の次のバージョンで修正される予定ですstd::make_pairただし、STLがそのバグの解決策に記しているように、左辺値参照へのテンプレート引数を作成する必要があります。

&std::make_pair<const std::wstring&, const unsigned&>
于 2011-05-07T13:49:57.963 に答える
3

g ++ 4.4.5は、エラーなしでコンパイルします。VisualStudio10の欠陥のようです。

于 2011-05-07T13:46:49.757 に答える