2016-07-28 4 views
3

Я получаю странную ошибку при попытке использовать наследование шаблона. Это мой код:Наследование шаблона и переменная элемента базы

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; }; 
}; 

И это ошибка:

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

И в случае, если это может повлиять на то, что я использую эти флаги:

-Wall -g -std=c++11 

Я действительно не знать, что не так, потому что тот же код, что и чистые классы без шаблонов, отлично работает.

+1

'недействительным тест() {станд :: соиЬ << "тестирование ..." << A :: << std :: endl; }; ' – Rerito

ответ

4

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

Это потому, что базовый класс (шаблон класса A) не nondependent базового класса, его тип не может быть определен, не зная аргументы шаблона. И a - это независимое имя. Независимые имена не просматриваются в зависимых базовых классах.

Для исправления кода вы можете указать имя a зависимые, зависимые имена могут быть просмотрены только во время создания экземпляра, и тогда будет изучена точная базовая специализация и будет известна.

Вы могли

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

или

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

или

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

Спасибо за ответ. Это имеет смысл сейчас :) –