В чем разница между шаблонами функций и шаблонами классов? - PullRequest
1 голос
/ 18 сентября 2010

Меня смущает странный синтаксис, предоставляемый шаблонами функций C ++ и шаблонами классов. Взгляните на код ниже:

#include <iostream>
#include <algorithm>
#include <functional>
#include <iterator>
#include <vector>
using namespace std;

template <class op1,class op2>
class compose_fg_x_t : public unary_function<typename op2::argument_type,typename op1::result_type>{
public:
// constructor

compose_fg_x_t(const op1& arg1,const op2& arg2): p1(arg1),p2(arg2){
}
//function call
typename op1::result_type operator()(const typename op2::argument_type& x) const{
    return p1(p2(x));
  }

private:
op1 p1;
op2 p2;

};

template <class Op1,class Op2>
inline compose_fg_x_t<Op1,Op2> compose_fg_x(const Op1& p1,const Op2& p2){
    return compose_fg_x_t<Op1,Op2>(p1,p2);
}
int main(int argc, char *argv[])
{
int a[] = {1,2,3,4,5};
vector<int> IntVec(a,a+sizeof(a)/sizeof(int));
copy(IntVec.begin(),IntVec.end(),ostream_iterator<int>(cout," "));
cout<<endl;
transform(IntVec.begin(),IntVec.end(),ostream_iterator<int>(cout,"    "),compose_fg_x( bind2nd(multiplies<int>(),5),bind2nd(plus<int>(),10) ));
transform(IntVec.begin(),IntVec.end(),ostream_iterator<int>(cout," "),compose_fg_x_t(   bind2nd(multiplies<int>(),5),bind2nd(plus<int>(),10) ));
return 0;
}

Итак, мой вопрос: почему первое преобразование является правильным, а второе - нет? Что делает вспомогательная функция compose_fg_x, так это возвращает объект базового типа compose_fg_x_t. Я пытаюсь опустить косвенный вызов функции, который не удается скомпилировать. Почему?

1 Ответ

4 голосов
/ 18 сентября 2010

Аргументы шаблона могут быть выведены только для шаблонов функций, но не для шаблонов классов. Весь смысл вспомогательных функций, таких как make_pair (или ваша compose_fg_x), состоит в том, чтобы обойти это ограничение.

Вот несколько менее сложный пример, демонстрирующий проблему:

#include <utility>

int main()
{
    auto x = std::make_pair(3, 4);   // function template arguments are deduced
    auto y = std::pair(3, 4);        // error: missing class template arguments
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...