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;
};
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…