在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的返回类型)

09-04 17:25