我在父类中有一个模板方法,它应该调用基类中的另一个方法。如果在基类中显式定义了该方法,它就可以工作,但是如果继承了该方法,它就不起作用。我无法弄清楚这段代码到底出了什么问题(虽然我知道这有点奇怪:)
class A
{
protected:
virtual void someMethod()
{
}
template <class TBaseClass>
void templateMethod()
{
TBaseClass::someMethod();
}
};
class B : public A
{
};
class C : public B
{
protected:
virtual void someMethod()
{
templateMethod<A>(); // this works
templateMethod<B>(); // this doesn't
}
};
这以编译器错误结束:
error C2352: 'A::someMethod' : illegal call of non-static member function
到底哪里出了问题?我不是在寻找解决方法,这很容易。我想知道为什么这是不正确的。
最佳答案
在template <TBaseClass> void A::templateMethod()
祈求者,this
, 类型为 A *
.因此,当您尝试调用 B::someMethod
时在其上,编译器不会将其识别为对象方法调用,因为 B
不是基类,但它仍然可以是静态方法调用,所以编译器会尝试,找到 B::someMethod
通过 A
继承并提示它不是静态的。事实A
是 this
的基类不相关;只有那个B
不是。
关于c++ - 在模板函数中调用继承的方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26867301/