проблема с наследованием шаблона - PullRequest
5 голосов
/ 06 июня 2010

Я пытаюсь понять, почему я получаю ошибку в этом коде: (ошибка в g ++ unix compiler. VS компилируется нормально)

template<class T> class A {
public:
    T t;
public:
    A(const T& t1) : t(t1) {}
    virtual void Print() const { cout<<*this<<endl;}
    friend ostream& operator<<(ostream& out, const A<T>& a) {
            out<<"I'm "<<typeid(a).name()<<endl;
            out<<"I hold "<<typeid(a.t).name()<<endl;
            out<<"The inner value is: "<<a.t<<endl;
            return out;
    }
};

template<class T> class B : public A<T> {
public:
    B(const T& t1) : A<T>(t1) {}
    const T& get() const { return t; }
};

int main() {
    A<int> a(9);
    a.Print();
    B<A<int> > b(a); 
    b.Print();
    (b.get()).Print();  
    return 0;
}

Этот код выдает следующую ошибку:

main.cpp: в функции-члене 'const T & B :: get () const':
main.cpp: 23: ошибка: 't' не было объявлено в этой области

Это скомпилировано, когда я изменил код B на это:

template<class T> class B : public A<T> {
public:
    B(const T& t1) : A<T>(t1) {}
    const T& get() const { return A<T>::t; }
};

Я просто не могу понять, в чем проблема с первым кодом ...
Не имеет смысла, что мне действительно нужно писать «A ::» каждый раз ...

1 Ответ

7 голосов
/ 06 июня 2010

Вы также можете использовать this->t для доступа к элементу шаблона базового класса.

В B::get() имя t не зависит от параметра шаблона T, поэтому оно не является зависимым именем. Базовый класс A<T>, очевидно, зависит от параметра шаблона T и, таким образом, является зависимым базовым классом. Независимые имена не ищутся в зависимых базовых классах. Подробное описание того, почему это так, можно найти в C ++ FAQ Lite .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...