Применение шаблонных типов в связных списках

Проблема с шаблонами. Не понимаю в чем проблема, вроде пол-года назад писал тоже самое и все работало, а сейчас компилятор жалуется (на template... перед class Node...) Visual S вообще не запускает, а online компилятор указывает на эту строку, а именно :

declaration of template parameter ‘T’ shadows template parameter

Не понимаю, что не так, объясните.

    template<typename T>
class List {
public:

    List();
    void push_back(T data);
private:

    template<typename T>
    class Node {
    private:
        T data;
        Node* pNext;
    public:
        Node(T data = T(), Node* pNext = nullptr) {
            this->pNext = pNext;
            this->data = data;
        }
    };
    Node<T>* head;
    int Size = 0;
};





template<typename T>
List<T>::List() {
    head = nullptr;
    Size = 0;
}

template<typename T>
void List<T>::push_back(T data) {
    if (head == nullptr) {
        head = new Node<T>(T data);
    }
    else {
        Node* current = this->head;
        while (current->pNext != nullptr) {
            current = current->pNext;
        }
        current->pNext = new Node<T>(data);
    }
    Size++;
}

int main()
{
    List<int> Data;
} 
    
     

Ответы (2 шт):

Автор решения: olkhovich

Можно сделать так:

template <class T> class List {
public:
   List();
   void push_back(T data);
private:
    struct Node {
       T data;
       Node* next;
};
Node* head = nullptr;

Зачем вам template<typename T> перед вашим классом Node?

И когда вы создаете головной элемент head, он должен быть типа Узла, то есть просто Node* head;

→ Ссылка
Автор решения: Qwertiy

declaration of template parameter ‘T’ shadows template parameter

Ну понятно же написано...

template<typename T>
class List {

    template<typename T>
    class Node {

Имена T одинаковые.

→ Ссылка