在Windows上与VS2005一起工作,并努力理解我收到的错误消息。如果以前曾问过这个问题,对不起。我找不到
我正在测试的班级:
#include <functional>
using std::unary_function;
template<typename F, typename G>
struct UnaryConvolution : unary_function<typename G::argument_type,typename F::result_type>{
UnaryConvolution(const F &_f, const G &_g) : m_F(_f), m_G(_g){}
result_type operator()(const argument_type &_arg){
return m_F( m_G( _arg ) );
}
F m_F;
G m_G;
};
我写的单元测试:
using std::bind2nd;
using std::equal_to;
using std::less;
bool unaryConvolution_test(){
UnaryConvolution obj(bind2nd( equal_to<bool>(), true ), bind2nd( less<int>(), 5 ));
return obj( 3 );
}
和我得到的错误:
错误C2955:“ UnaryConvolution”:使用类模板需要模板参数列表
错误C3848:类型为'UnaryConvolution'的表达式将丢失一些const volatile限定符,以便调用'_Result UnaryConvolution :: operator()(const _Arg&)'
错误C2514:“ UnaryConvolution”:类没有构造函数
即使添加行
int val = 3
然后传递val
也无效。 (顺便说一句,项目禁止使用Boost或任何第三方库。不要问,我尽量不要。) 最佳答案
UnaryConvolution
是类模板,而不是类。您需要指定用于实例化模板的模板参数。例如,
UnaryConvolution<
function<bool(bool)>,
function<bool(int)>
> obj(bind2nd( equal_to<bool>(), true ), bind2nd( less<int>(), 5 ));
(我使用了
function
,可以从Boost,C ++ TR1或C ++ 0x中获得它,而不是bind2nd
的实际返回类型,它并不那么简单。如果您不这样做,可以访问function
的某些实现,那么您需要确定bind2nd
的返回类型)