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

前端 未结 1 791
难免孤独
难免孤独 2020-12-06 18:45

Consider the following C++ code,

template 
struct A
{
    bool usable_;
};

template 
struct B : A< B<         


        
相关标签:
1条回答
  • 2020-12-06 19:02

    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.

    0 讨论(0)
提交回复
热议问题