2015-03-23 3 views
0

Мне нужно поменять класс связанного списка для int, который я написал в шаблон класса. У меня возникают проблемы с конструктором и деструктором для структуры, вложенной в класс List, называемый узлом.Проблема с конструктором Struct, вложенным в шаблон класса

Layout:

template <typename T> 
    class List 
    { 
    public: 
     //Stuff that's not important to this question 
    private: 
     struct Node 
     { 
     Node(T value);    // constructor 
     ~Node();    // destructor 
     Node *next;    // pointer to the next Node 
     T data;    // the actual data in the node 
     static int nodes_alive; // count of nodes still allocated 
     }; 
    }; 

Реализация:

template <typename T> 
typename List<T>::Node::Node(T value) 
{ 
    data = value; 
    next = 0; 
} 

template <typename T> 
typename List<T>::Node::~Node() 
{ 
    --nodes_alive; 
} 

Ошибки:

  1. Ожидаемые ';' в конце декларации

    Ьурепата Список :: Узел :: Узел (значение Т)

  2. ожидался идентификатор или идентификатор шаблона после '::'

    Ьурепата Списка :: Узел :: ~ Узел ()

  3. Ожидаемое имя класса после '~', чтобы назвать деструктор

    имяТипа Список :: Node :: ~ Node()

Не совсем уверен, что здесь происходит. Моя реализация находится в отдельном файле, расположенном в нижней части файла заголовка. Любая помощь будет принята с благодарностью.

+2

Вы забыли ',' в конце 'класса list' – clcto

+0

хотя я забыл, когда я скопировал его на его правильно в моем источнике, который ведет к ошибкам. Я исправлю сообщение, хотя, спасибо! –

ответ

3

Это просто: Избавьтесь от ключевого слова typename. Поскольку вы пишете конструктор/деструктор и нет типа возврата, он не нужен.

template <typename T> 
List<T>::Node::Node(T value) 
{ 
    data = value; 
    next = 0; 
} 

template <typename T> 
List<T>::Node::~Node() 
{ 
    --nodes_alive; 
} 
+0

Yup! Это исправило мою проблему. Просто чтобы убедиться, что я правильно понял, я должен использовать ключевое слово typename, когда я говорю о типе, который был создан шаблоном? –

+0

Да, вот и все. Поскольку тип возврата зависит от шаблона, ему должно предшествовать 'typename', поэтому компилятор знает, что это тип. –

Смежные вопросы