операторы — ошибка компиляции C ++ с использованием унарных и бинарных функциональных объектов

У меня есть короткий вопрос относительно фрагмента кода C ++. Я получаю ошибку компиляции, как только я хочу оценить () оператор (последняя строка перед возвратом 0 в основном методе). Код выглядит так:

    #include <functional>
#include <algorithm>
#include <iostream>

using namespace std;

//multiplication by 10
template <typename A, typename B>
struct multiply_by_ten : unary_function<A, B> {
B operator()(A& a) {
return a*10;
}
};

//addition of the paramters
template <typename A, typename B, typename C>
struct add: binary_function<A, B, C> {

C operator()(A& a, const B& b) {
return  a + b;
}
};

template <typename BinOp, typename Op1, typename Op2>
class combineops_t : public unary_function<typename Op1::argument_type,typename       BinOp::result_type>

{
protected:
BinOp o; Op1 o1; Op2 o2;
public:
combineops_t(BinOp binop, Op1 op1, Op2 op2) : o(binop), o1(op1), o2(op2) {}

typename BinOp::result_type operator()( const typename Op1::argument_type &x) {
return o(o1(x),o2(x));
}
};int main(int argc, char **argv) {
add<int, int, int> a;
multiply_by_ten<int, int> b;
multiply_by_ten<int, int> c;

combineops_t<binary_function<int, int, int> , unary_function<int, int> , unary_function<int, int> >
z(a, b, c);
cout << z(13);

return 0;
}

Ошибка компиляции на немецком языке, но в основном это говорит о том, что ..

теперь есть соответствие для вызова «.

-1

Решение

Это потому, что вы меняете тип аргумента типа на std::unary_function а также std::unary_function нет оператора вызова функции !!

В подобных ситуациях у вас сложная структура для вашего шаблона и его аргументов, лучший способ — написать вспомогательную функцию, которая создаст для вас шаблон:

template< class BinOp, class OP1, class OP2 >
combineops_t<BinOp, OP1, OP2> combine_ops( BinOp const& bop, OP1 const& op1, OP2 const& op2 )
{
return combineops_t<BinOp, OP1, OP2> ( bop, op1, op2 );
}

int main() {
...

auto z = combine_ops( a, b, c );
std::cout << z( 13 );
}

Если ваш компилятор не поддерживает C ++ 11 auto просто используйте это:

combineops_t<
add<int, int, int>,
multiply_by_ten<int, int>,
multiply_by_ten<int, int>
> z( a, b, c );

И помимо этого есть еще одна ошибка в вашем коде, в multiply_by_ten а также add шаблоны вы получаете a параметр по ссылке, так что просто конвертировать A& в этих шаблонах A const&

0

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector