Сколько аргументов требуется transform()?

#c #stl #transform

#c #stl #преобразование

Вопрос:

Следующий код содержит ошибку о количестве аргументов для transform() . Существует две версии transform() , одна принимает четыре аргумента, а другая — пять. Почему компилятор пытается использовать вторую версию? Кстати, я использую VS2008

 template<class T> T same(const Tamp; 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 ?

2. Это пример из книги Страуструпа, просто хочу попробовать.

3. Тогда пример неверен, same это недопустимое что-либо.

Ответ №1:

Потому что same недопустимо UnaryOperator , поскольку это шаблонная функция. Вместо этого вы хотите что-то вроде этого:

 amp;same< typename iterator_traits< Out >::value_type >
  

Обратите внимание, что amp; является необязательным

Или вы могли бы превратить same в объект полиморфной функции:

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

и используйте same() как UnaryOperator .