Доступ к псевдонимам типов в базовом классе из производного класса - PullRequest
1 голос
/ 31 марта 2020

При попытке получить доступ к псевдониму типа в базовом классе из производного класса я сталкиваюсь со следующей проблемой:

template <typename T>
class A {
    public:
        using T2 = T;
};

template <typename T>
class B: public A<T> {
    public:
        typename A<T>::T2 obj1;  // OK
        T2 obj2;  // Error
};

template <typename T>
class C: public A<int> {
    public:
        typename A<int>::T2 obj1;  // OK
        T2 obj2;  // OK
};

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

Заранее спасибо.

1 Ответ

4 голосов
/ 31 марта 2020

T2 - это независимое имя. Независимые имена не будут просматриваться в зависимых базовых классах, таких как A<T>, что зависит от параметра шаблона T.

A<T>::T2, это зависимое имя. Зависимые имена можно искать только во время создания экземпляра, и в это время будет известна точная базовая специализация, которая должна быть изучена.

С другой стороны, когда базовый класс равен A<int>, код работает, потому что A<int> является независимым базовым классом, а независимое имя T2 будет найдено в области A<int>.

...