C++ 在模板虚拟类层次结构中调用基类方法

C++ 在模板虚拟类层次结构中调用基类方法,c++,templates,virtual,C++,Templates,Virtual,假设我有以下类层次结构: template< class T > class TestBase { public: virtual T const & do_foo() = 0; }; template< class T > class TestDerived : public virtual TestBase< T > { public: virtual int do_bar() { return do_f

假设我有以下类层次结构:

template< class T >
class TestBase {

public:

    virtual T const & do_foo() = 0;

};

template< class T >
class TestDerived : public virtual TestBase< T > {

public:

    virtual int do_bar() {
        return do_foo() + 1;
    }

};
现在,如果我将其更改为从已知类型实例化的TestBase派生(例如,
类TestDerived:public virtual TestBase
,此代码段编译得很好,因此问题显然与编译时未知的基类类型有关。但由于我没有在任何地方实例化任何一个类的对象,我不明白为什么这会有问题

基本上,我如何在不诉诸
-fppermissive
的情况下解决错误?

非依赖名称(即不依赖于模板参数的名称),在解析模板时查找,而不是在实例化模板时查找。您需要将
do\u foo
设置为从属名称。基本上有两种方法可以实现此目的:

virtual int do_bar() {
    return this->do_foo() + 1;
}

模板
类TestDerived:公共虚拟测试库{
公众:
使用TestBase::do_foo;
虚拟int do_bar(){
返回do_foo()+1;
}
};

它不会因为它的美丽而赢得任何奖项,但是这段代码按照预期工作,没有编译器的抱怨

virtual int do_bar() {
    return ((TestBase<T> *) this)->do_foo() + 1;
}
virtualint do_bar(){
返回((TestBase*)this)->do_foo()+1;
}

TestDerived
中是否应该是
virtual t do_bar()
?@BartekBanachewicz-我不认为这是必要的,t可以是任何类型,例如
decltype(do_foo()+1)
是一个int(或者我认为可以隐式转换为int)。哦,好的。它当然会触发实例化。还有第三种方法:显式限定名称,而不是通过
使用
@KonradRudolph导入名称,这会改变语义。如果使用我列出的方法之一,则使用动态分派(虚拟调用)正常工作。如果您明确符合条件,动态调度将被忽略。您不需要强制转换。仅使用
此->
也可以工作。事实上,我尝试此操作时肯定出了其他问题!您的答案更完整;投了赞成票!谢谢。作为记录,我没有对您投反对票(您的答案本身没有错)。
template< class T >
class TestDerived : public virtual TestBase< T > {

public:
    using TestBase<T>::do_foo;

    virtual int do_bar() {
        return do_foo() + 1;
    }

};
virtual int do_bar() {
    return ((TestBase<T> *) this)->do_foo() + 1;
}