2015-02-16 2 views
-3

Я пытаюсь написать код, чтобы найти начало цикла в связанном списке. Вот мой код:Не удается скомпилировать и обнаружить ошибку

#include <iostream> 

template <class T> 
class LinkedList 
{ 
public: 
    struct node 
    { 
     T data; 
     node* next; 
    }; 
    node* head; 
    LinkedList() : head(NULL){}; 
    void AppendToTail(T data); 
    void InsertToHead(T data); 
    void RemoveDuplicates(); 
    void PrintList(); 
    T lastNthNode(int N); 
    bool operator==(const LinkedList<T>& L); 
    node* FindBeginningNodeLoop(); 
}; 

template <class T> 
node* LinkedList<T>::FindBeginningNodeLoop() 
{ 
    if (head == NULL) 
     return NULL; 
    node* slow = head; 
    node* fast = head; 
    while (fast->next != NULL) 
    { 
     slow = slow->next; 
     fast = fast->next->next; 
     if (slow == fast) 
      break; 
    } 
    if (fast == NULL) 
     return NULL; 

    slow = head; 
    while (slow != fast) 
    { 
     slow = slow->next; 
     fast = fast->next; 
    } 
    return slow; 
} 

Компилятор дает следующие ошибки:

1> main.cpp 1> C: \ Users ... \ linkedlist.h (177): ошибка C2143: синтаксическая ошибка: отсутствует ';' before '*' 1> c: \ users ... \ linkedlist.h (177): ошибка C2065: 'T': необъявленный идентификатор 1> c: \ users ... \ linkedlist.h (177): error C2923: 'LinkedList': 'T' не является допустимым аргументом типа шаблона для параметра 'T' 1> c: \ users ... \ linkedlist.h (200): ошибка C2509: 'FindBeginningNodeLoop': функция-член не объявлена в 'LinkedList' 1> c: \ users ... \ linkedlist.h (5): см. объявление 'LinkedList'

Я не могу найти проблему. Любая помощь приветствуется. Спасибо.

+0

Вот только сообщение об ошибке моего компилятора, дословно. 'blah.cpp: 24: 1: error: неизвестный тип имя 'node' node * LinkedList :: FindBeginningNodeLoop()' – ftynse

+0

В коде, который вы отправили, всего 47 строк. Где линия 177? –

+0

Возможный дубликат [Что такое ошибка «необъявленного идентификатора» и как его исправить?] (Http://stackoverflow.com/questions/22197030/what-is-an-undeclared-identifier-error-and-how- do-i-fix-it) – sashoalm

ответ

2

node является внутренним типом LinkedList. У вас есть twooptions:

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

LinkedList<T>::FindBeginningNodeLoop()->node* { .... } 

Или использовать рамки этого класса, когда ссылающийся на него вне определения класса:

template <class T> 
typename LinkedList<T>::node* LinkedList<T>::FindBeginningNodeLoop() { .... } 
     ^^^^^^^^^^^^^^^ 

Кроме того, вам нужно использовать typename, чтобы указать, что node является тип (см when is the typename keyword necessary для получения дополнительной информации.)

Вторая версия требуется, если ваш компилятор не поддерживает C++ 11 или C++ 14.

+0

не забывайте 'typename' – ftynse

+0

@ftynse Спасибо, отредактирован. – juanchopanza

+0

Большое спасибо! Код скомпилирован без проблем! – Robomatt

1

Вы объявили структуру node в пределах LinkedList класс. Имя node не видно сам по себе, ему должно предшествовать LinkedList<T>:: каждый раз, когда он используется вне определения класса.

Кроме того, для определения различия между типом и (в конечном итоге существующей) переменной с тем же именем потребуется использовать ключевое слово typename.

+0

Спасибо вам большое! Теперь код скомпилирован без ошибок. – Robomatt

+0

Это не значит, что требуется 'typename'.В коде в вопросе нет упоминания переменной с тем же именем, и нет никакой причины для существования такой переменной. 'typename' требуется, потому что' node' является * зависимым * именем. – user2079303

+0

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

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