无法推断模板参数

Ben*_*ley 1 c++ templates

我试图用std::transform两个相等大小的向量合并成一对向量.

int main()
{
    vector<string> names;
    // fill it with names    
    vector<int> nums;
    // fill it with numbers

    typedef pair<int,string> Pair_t;
    vector<Pair_t> pv;

    transform(nums.begin(), nums.end(),
              names.begin(), back_inserter(pv),
              make_pair<int,string>);
}
Run Code Online (Sandbox Code Playgroud)

VC10给了我:

'_OutIt std::transform(_InIt1,_InIt1,_InIt2,_OutIt,_Fn2)' : could not deduce template argument for '_OutIt' from 'std::back_insert_iterator<_Container>'
          with
          [
              _Container=std::vector<Pair_t>
          ]
Run Code Online (Sandbox Code Playgroud)

那么为什么不能推导出模板参数呢?我该如何解决?

Ken*_*kot 5

这是由于当前版本的VC10中的一个错误导致make_pair无法正确解决过载问题.

有一个关于这个确切的问题的讨论在这里,与使用的C++ 0x lambda表达式,这是由VC10支持的解决办法一起.

  • 具体地,问题是,在VC++ 2010`的std :: make_pair`超载用于`(T1常量&,T2常量&)`,`(T1 &&,T2常量&)`,`(T1常量&,T2 &&)`和`(T1 && ,T2 &&)`,而*current*标准只调用`(T1 &&,T2 &&)`然后适当地转发.因此,明确指定`T1`和`T2`的类型不足以缩小单个候选的可用重载. (2认同)