错误:c ++模板函数

时间:2011-03-24 15:46:12

标签: c++ class templates

您好我尝试在vc ++中构建一个tamplate函数,如下所示:

template<class _Fn0,class _Fn1>   void for_each(_Fn0 _Func0,_Fn1 _Func1)
{    
    _Func0(12);
    _Func1(12);

}

当我使用_Func0 / 1这个全局函数时,这项工作正在顺利进行。

void aglobal(int a)
{
    a++;
}
for_each(aglobal,aglobal);

但是当我使用memeber类函数时,我收到错误消息。

class A
{
public:
    void aa(int a)
    {
        a++;
    }
    void bb(int b)
    {
        b++;
    }
    void cc()
    {
        for_each(&A::aa,&A::bb);
    }
};

错误C2064:术语不评估为采用1个参数的函数 1 GT;请参阅正在编译的函数模板实例化'void for_each(_Fn0,_Fn1)'的引用。

我如何解决此错误?

谢谢herzl。

2 个答案:

答案 0 :(得分:9)

A::aaA::bb是非静态成员函数;你试图将它们称为非成员函数。

只能在对象的实例上调用非静态成员函数。

要修复它,你可以

  1. aabb设为静态,或

  2. A的实例传递给for_each,以便它可以调用该实例上的函数,或者

  3. 使用std::bind / std::tr1::bind / boost::bind将成员函数绑定到实例,然后再将其传递给函数模板,或者

  4. 编写一个函子,它存储一个指向要调用成员函数的A实例的指针,以及一个指向要调用的成员函数的指针;这实际上是bind的作用(虽然bind更通用)。

答案 1 :(得分:1)

类的成员函数总是接受额外的参数“this”指针,所以你可以让它们静态来试试这个。