【问题标题】:Template argument cannot be deduced不能推导出模板参数
【发布时间】:2011-05-03 09:38:31
【问题描述】:

我正在尝试使用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>);
}

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

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

【问题讨论】:

  • 在 GCC 4.4.3 上为我编译 OK。

标签: c++ templates


【解决方案1】:

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

关于这个确切的问题here 的讨论,以及使用 C++0x lambda 表达式的解决方法,VC10 支持。

【讨论】:

  • 具体来说,问题是在 VC++ 2010 中,std::make_pair 对于 (T1 const&amp;, T2 const&amp;)(T1&amp;&amp;, T2 const&amp;)(T1 const&amp;, T2&amp;&amp;)(T1&amp;&amp;, T2&amp;&amp;) 过载,而 current标准只要求 (T1&amp;&amp;, T2&amp;&amp;) 然后适当地转发。因此,显式指定 T1T2 的类型并不足以将可用重载范围缩小到单个候选对象。
猜你喜欢
  • 2012-02-21
  • 1970-01-01
  • 2016-07-23
  • 1970-01-01
  • 2018-12-09
  • 1970-01-01
  • 2011-08-28
  • 1970-01-01
相关资源
最近更新 更多