功能与模板和提升

时间:2011-12-17 15:17:24

标签: c++ templates boost functor boost-bind

我尝试编写一个函子来调用带有bind和一些模板的boost函数。所以我有这个主要的:

int     function(char c)
{
   std::cout << c << std::endl;
   return (0);
}

int main()
{
    Function<int (char)> fb = boost::bind(&function, _1);
    fb('c');
    return (0);
}

这是我的班级Function

template<typename F>
class Function
{
private:
    F       functor;

public:
    Function()
    {
        this->functor = NULL;
    };

    Function(F func)
    {
        this->functor = func;
    };

    template <typename P>
    void    operator()(P arg)
    {
        (*this->functor)(arg);
    };

    void    operator=(F func)
    {
        this->functor = func;
    };
};

我有一个问题:当我尝试编译时,我有这些错误:

error C2440: 'initializing' : cannot convert from 'boost::_bi::bind_t<R,F,L>' to 'Function<F>'
IntelliSense: no suitable user-defined conversion from "boost::_bi::bind_t<int, int (*)(char), boost::_bi::list1<boost::arg<1>>>" to "Function<int (char)>" exists  

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:0)

boost::bind将返回未指定的内容,但可以转换为 boost::function。你没有理由拥有自己的 function上课。

看看这个简单的例子:

#include <boost/bind.hpp>
#include <boost/function.hpp>

int func(char) { return 23; }

int main()
{
  boost::function<int(char)> bound = boost::bind(func, _1);
  return 0;
}

unspecified返回类型对您的案例意味着什么?您需要删除FunctionAnyFunction的类型 需要写一些名为Function的东西。为什么?因为你永远无法在C ++ 03中拼出{{1}}的模板参数的类型(甚至是C ++ 11,例如只接受特定类型作为函数参数)。