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.
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. Anda
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
or
or