@wrongwayboyyy

Как работает наследование полей у шаблонного класса?

#ifndef MYLIST_H
#define MYLIST_H
#include <iostream>
#include <vector>

using namespace std;

template <typename F>
        class Node {
        public:
        template <typename T>
        friend class myList;
        Node(F data = F(), Node<F>* pPrev = nullptr, Node<F>* pNext = nullptr) : data(data), pPrev(pPrev), pNext(pNext) {};
        private:
        F data;
        Node<F>* pNext;
        Node<F>* pPrev;
    };

template<typename T>
class myList {
    public:
    myList();
    ~myList();
    void push_back(T);
    void push_front(T);
    void pop_back();
    void pop_front();
    void remove_if(bool (&f)(T));
    void even_then_uneven();
    void cycle_delete(int k);
    int getSize() const;
    void output() const;
    public:
    Node<T>* head;
    Node<T>* tail;
    int size;
    void push(Node<T>*, T);
    void pop(Node<T>*);
};

// Определение всех методов базового класса
// ...


template<typename T> 
class Cycled_List: public myList<T> {
    public:
    void foo() {
        tail = head = nullptr;
        cout << "Success";
    }
};
#endif


Есть вот такой фрагмент кода. Вопрос состоит в том, что при попытке вызова из мейна метода foo() класса сycled_list компилятор (g++) ругается на то, что tail и head "wasn't declared in this scope". Проблема решается, если явно указать в какой области видимости находятся tail и head, но, понятно, что это это не очень приятно и вроде бы должно работать не так. Почему не получается неявно найти, что head и tail это поля базового класса?
  • Вопрос задан
  • 63 просмотра
Решения вопроса 1
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Как работает наследование полей у шаблонного класса?

Наследование работает так же как и у не-шаблонного класса, а поиск имён -- по-другому.

Почему не получается неявно найти, что head и tail это поля базового класса?

Потому что имена head и tail не являются именами, которые могут быть использованы в определении шаблона -- они не T, не являются зависимыми и не определены в видимых из определения шаблона неймспейсах.

(соответственно, пофиксить можно не только написав myList<T>::head, но и this->head, оба эти изменения делают имя head зависимым [от параметра шаблона]).

Это правило поиска имён отличается от правил поиска имён в обычных классах, которое включает в себя родительские классы.
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы