【问题标题】:How many arguments are required by transform()?transform() 需要多少个参数?
【发布时间】:2011-11-04 23:08:20
【问题描述】:

以下代码在transform() 的参数数量方面存在错误。 transform() 有两个版本,一个需要四个参数,另一个需要五个参数。为什么编译器试图使用第二个版本?顺便说一下,我用的是VS2008

template<class T> T same(const T& t){ return t; }

template<class In, class Out>
Out my_copy(In first, In last, Out res){

    return transform(first, last, res, same);
}

void test(){
    int a[]={1,2,3,4,5,6};
    vector<int> v(a,a+sizeof(a)/sizeof(int));
    vector<int> v2(v.size());
    my_copy(v.begin(), v.end(), v2.begin());
}


// error C2780: '::std::_Enable_if<!std::_Is_checked_iterator<_OutIt>::_Result||!std::_Is_checked_iterator<_OutIt>::_Result,_OutIt>::_Result std::transform(_InIt1,_InIt1,_InIt2,_OutIt,_Fn2)' : expects 5 arguments - 4 provided

【问题讨论】:

  • 你为什么不直接使用std::copy
  • 这是Stroustrup书中的一个例子,只是想尝试一下。
  • 那么例子是错误的,same 不是一个有效的东西。

标签: c++ stl transform


【解决方案1】:

因为same 不是有效的UnaryOperator,因为它是一个模板函数。你想要这样的东西:

&same< typename iterator_traits< Out >::value_type >

注意&amp; 是可选的

或者你可以将same 变成一个多态函数对象:

struct same
{
    template< typename T >
    T operator ()( T const& t ) const { return t; }
};

并使用same() 作为UnaryOperator

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-06-25
    • 2012-01-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多