关于镜头C ++代码段我有一个简短的问题。一旦我想评估()
运算符(在main方法中返回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;
}
编译错误是德语,但基本上说是..
现在按照“。
的调用
答案 0 :(得分:0)
这是因为您将类型参数的类型更改为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&
转换为{ {1}}