无法编译和定位错误

时间:2015-02-16 14:15:19

标签: c++

我正在尝试编写代码来查找链表中循环的开头。 这是我的代码:

#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&GT; main.cpp中 1&gt; c:\ users ... \ linkedlist.h(177):错误C2143:语法错误:缺少&#39 ;;&#39;之前&#39; *&#39; 1&gt; c:\ users ... \ linkedlist.h(177):错误C2065:&#39; T&#39; :未声明的标识符 1&gt; c:\ users ... \ linkedlist.h(177):错误C2923:&#39; LinkedList&#39; :&#39; T&#39;不是参数&#39; T&#39;的有效模板类型参数。 1&gt; c:\ users ... \ linkedlist.h(200):错误C2509:&#39; FindBeginningNodeLoop&#39; :成员函数未在&#39; LinkedList&#39;中声明 1 GT; c:\ users ... \ linkedlist.h(5):参见&#39; LinkedList&#39;

的声明

我找不到问题。任何帮助是极大的赞赏。 感谢。

2 个答案:

答案 0 :(得分:2)

nodeLinkedList的内部类型。你有两个选择:

使用尾随返回类型,其中返回类型在类的范围内:

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,则需要第二个版本。

答案 1 :(得分:1)

您在node课程中声明了结构LinkedList。名称node本身不可见,每次在类定义之外使用时都应以LinkedList<T>::开头。

此外,还需要使用typename关键字来区分类型和同名的(最终存在的)变量。