Consider the following C++ code,
template <typename Derived>
struct A
{
bool usable_;
};
template <typename Derived>
struct B : A< B<Derived> >
{
void foo()
{
usable_ = false;
}
};
struct C : B<C>
{
void foo()
{
usable_ = true;
}
};
int main()
{
C c;
}
I got compilation error: In member function void B<Derived>::foo()
:
template_inherit.cpp:12: error: 'usable_' was not declared in this scope.
Why is that ? Any good fix ?
That's because usable_
is a non-dependent name, so it is looked up at the time the template is parsed, instead of being looked up at instantiation (when the base class is known).
Unqualified name lookup will not lookup and non-dependent names are never looked up in dependent base classes. You can make the name usable_
dependent as follows, which will also get rid of unqualified name lookup
this->usable_ = false;
// equivalent to: A<B>::usable_ = false;
A< B<Derived> >::usable_ = false;
B::usable_ = false;
All of these will work. Or you can declare the name in the derived class with a using-declaration
template <typename Derived>
struct B : A< B<Derived> >
{
using A< B<Derived> >::usable_;
void foo()
{
usable_ = false;
}
};
Note that in C
there will be no problem - it only affects B
.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With