Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
346 views
in Technique[技术] by (71.8m points)

c++ - Base template class data members are not visible in derived template class?

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 ?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

1.4m articles

1.4m replys

5 comments

57.0k users

...