2
class A{

    virtual int foo1(int a){ 

        return foo1_1(a,filler(a));
    }   

    template<typename FunctionPtr_filler> 
    int foo1_1(int a, FunctionPtr_filler ptrFn)
    {   
        int b;
        b = (this->*ptrFn)(a);  // --> compile error: pointer to member type int (B::)(int) incompatible with object type A
        return b;
    }   

    protected:
    virtual int filler(int a){ 
        return a*a;
    }   
};

class B: public A{
    virtual int foo1(int a){ 
        return foo1_1(a, &B::filler);
    }   
    virtual int filler(int a){ 
        return (a+a);
    }   
};

他们有什么方法可以克服这个错误。我想通过填充函数并避免重复代码的代码气味。

4

1 回答 1

2

我认为这里的问题是您将以下内容作为参数传递:

&B::filler

这是一个指向成员函数的指针,定义在B. 在基类中,您试图将其称为

(this->*ptrFn)(a);

这里的问题是,如果接收者对象实际上不是 type 的对象B,这将导致严重的运行时错误,因为您将在B类型不是的对象上调用方法B。C++ 给你一个编译器错误,告诉你这是不允许的。

要解决此问题,请将调用更改为传入

&A::filler

这是 中的一个方法A,所以任何A对象都会有这个特定的方法。C++ 将虚拟地自动解析调用以引用该方法的最派生实现,因此B在这种情况下它应该调用函数的版本。

希望这可以帮助!

于 2012-06-14T19:46:44.517 回答