Base template class data members are not visible in derived template class?

[亡魂溺海] 提交于 2019-11-26 21:51:36

问题


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 ?


回答1:


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.



来源:https://stackoverflow.com/questions/4210108/base-template-class-data-members-are-not-visible-in-derived-template-class

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!