2011-11-04 98 views
1

以下代码对于transform()的参数数量有误。 transform()有两个版本,一个需要四个参数,另一个需要五个。为什么编译器试图使用第二个版本?顺便说一句,我使用VS2008transform()需要多少个参数?

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 
+1

为什么你不使用'std :: copy'? –

+0

这是Stroustrup书中的一个例子,只是想尝试一下。 – ubbdd

+0

那么这个例子是错误的,'same'不是一个有效的东西。 –

回答

3

因为same不是有效UnaryOperator,因为它是一个模板函数。你想这样的事情,而不是:

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

&是可选

或者你可以让same成多态函数对象:

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

,并使用same()UnaryOperator