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
350 views
in Technique[技术] by (71.8m points)

c++ - Template inheritance and a base member variable

I get a weird error when trying to use template inheritance. This is my code:

template <class T> class A {
public:
    int a {2};
    A(){};
};

template <class T> class B : public A<T> {
    public:
    B(): A<T>() {};
    void test(){    std::cout << "testing... " << a << std::endl;   };
};

And this is the error:

error: use of undeclared identifier 'a'; did you mean 'std::uniform_int_distribution<long>::a'?
    void test(){    std::cout << "testing... " << a << std::endl;   }

And in case it could affect something I use these flags:

-Wall -g -std=c++11

I really don't know what is wrong since the same code as pure classes without templating works fine.

See Question&Answers more detail:os

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

1 Reply

0 votes
by (71.8m points)

I really don't know what is wrong since the same code as pure classes without templating works fine.

This is because the base class (class template A) is not a nondependent base class, its type can't be determined without knowing the template arguments. And a is a nondependent name. Nondependent names are not looked up in dependent base classes.

To correct the code, you could make the name a dependent, dependent names can be looked up only at the time of instantiation, at that time the exact base specialization must be explored and will be known.

You could

void test() { std::cout << "testing... " << this->a << std::endl; };

or

void test() { std::cout << "testing... " << A<T>::a << std::endl; };

or

void test() { 
    using A<T>::a;
    std::cout << "testing... " << a << std::endl; 
};

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

...