c++ - STL:卷积两个 unary_function 参数

标签 c++ templates stl

使用 VS2005 在 Windows 上工作并努力理解我收到的错误消息。如果之前有人问过这个问题,我很抱歉。我找不到它。

我正在测试的类:

#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 );
}

和我遇到的错误:

  1. 错误 C2955:“UnaryConvolution”:类模板的使用需要模板参数列表
  2. 错误 C3848:类型为“UnaryConvolution”的表达式将丢失一些 const-volatile 限定符以调用“_Result UnaryConvolution::operator ()(const _Arg &)”
  3. 错误 C2514:“UnaryConvolution”:类没有构造函数

即使添加行 int val = 3 然后传递 val 也没有效果。 (顺便说一句,项目禁止使用 Boost 或任何 3rd 方库。不要问,我尽量不要。)

最佳答案

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

关于c++ - STL:卷积两个 unary_function 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3669034/

相关文章:

c++ - for循环很慢导致asp超时

c++ - nth_element 是如何实现的?

c++ - 用于格式化邮件、报告的 C++ 文本模板库

c++ - 自定义 "::operator new"是否需要 std 容器的特殊分配器?

c++ - C++ 的可调整大小的字符缓冲区容器类型

c++ - 显示一年中每一天的新信息

C++ 异常按值抛出按引用捕获

c++ - 一些比普通循环和设置更快地分配和初始化数组的方法

C++ 段错误 : Passing a string to a node in a linked list

c++ - 指针模板清除函数的 vector 无法编译并显示 "undefined reference"消息