Связанный список не компилируется - PullRequest
0 голосов
/ 25 февраля 2012

Этот код не компилируется в моей системе;Я использую Затмение.

// Linked list head
template<class T>
struct Node
{
    // constructor
    Node(const T& a) : pNext(NULL), data(a) {}
    Node* pNext; //link
    T data;
}; // end of header


// List code
#include <iostream>
#include "LinkedList.h"

template<class T>
class linkedList
{
public:
    typedef Node<T> Node;
    //constructor creates empty list
    linkedList() : pHead(NULL), size(0) {}

~linkedList()
{
    Node* pIter = pHead;
    while(pIter != NULL)
    {
        Node* pNext = pIter->pNext;
        delete pIter;
        pIter = pNext;
    }
}

void insert(const T& data)
{
    Node* pInsert = new Node(data);
    if(pHead == NULL)
    {
        pHead = pInsert;
    }
    else
    {
        pInsert->pNext = pHead;
        pHead = pInsert;
    }
}

private:
    Node* pHead; // always points to head of list
    unsigned int size; // stores number of elements in list
};

Вот сообщение об ошибке:

./LinkedList.cpp:14:18: error: declaration of 'typedef struct Node<T> linkedList<T>::Node'
../LinkedList.h:4:1: error: changes meaning of 'Node' from 'struct Node<T>'
make: *** [LinkedList.o] Error 1

1 Ответ

4 голосов
/ 25 февраля 2012

Ошибка довольно очевидна: не используйте имя Node. Вместо этого вы можете написать что-то вроде этого:

typedef Node<T> node_type;

Имена шаблонов и имена типов имеют одно и то же пространство имен в C ++, поэтому вы не можете использовать одно и то же имя для двух разных сущностей, даже если один является шаблоном, а другой - типом.

(Несколько странно, что имена тегов как в C, так и в C ++ содержат немало тонкостей; эта статья может стоить прочтения, а this и это .)

...