Let\'s say I have the following class hierarchy:
template< class T >
class TestBase {
public:
virtual T const & do_foo() = 0;
};
template&l
It will not win any awards for it's beauty, but this piece of code works as expected, without the compiler complaining.
virtual int do_bar() {
return ((TestBase<T> *) this)->do_foo() + 1;
}
Non-dependent names (that is, names which do not depend on template arguments), are looked up when parsing the template, not when instantiating it. You need to make do_foo
a dependent name. There are basically two ways to achieve this:
virtual int do_bar() {
return this->do_foo() + 1;
}
or
template< class T >
class TestDerived : public virtual TestBase< T > {
public:
using TestBase<T>::do_foo;
virtual int do_bar() {
return do_foo() + 1;
}
};