<如何是语法错误?

How is < a syntax error?

本文关键字:语法 错误 lt      更新时间:2023-10-16
#include <iostream>
using namespace std;
template <typename E>
class SNode{
    E elem;
    SNode<E>* next;
    friend class SLINKEDList <E>;
};
template <typename E>
class SLinkedList { // a singly linked list
public:
    SLinkedList(); // empty list constructor
    ~SLinkedList(); // destructor
    bool empty() const; // is list empty?
    const E& front() const; // return front element
    void addFront(const E& e); // add to front of list
    void removeFront(); // remove front item list
private:
    SNode<E>* head; // head of the list
};
template <typename E>
SLinkedList<E>::SLinkedList() // constructor
    : head(NULL) { }
template <typename E>
bool SLinkedList<E>::empty() const // is list empty?
{
    return head == NULL;
}
template <typename E>
const E& SLinkedList<E>::front() const // return front element
{
    return head−>elem;
}
template <typename E>
SLinkedList<E>::~SLinkedList() // destructor
{
    while (!empty()) removeFront();
}
template <typename E>
void SLinkedList<E>::addFront(const E& e) { // add to front of list
    SNode<E>* v = new SNode<E>; // create new node
    v−>elem = e; // store data
    v−>next = head; // head now follows v
    head = v; // v is now the head
}
template <typename E>
void SLinkedList<E>::removeFront() { // remove front item
    SNode<E>* old = head; // save current head
    head = old−>next; // skip over old head
    delete old; // delete the old head
}
int main(){
    return 0;
}

我从我的数据结构书(Goodman)中复制了这个节点代码,它有错误,但我不确定为什么。我确实尝试手动键入它以查看它是否是字符编码问题,但似乎并非如此。我也尝试定义SLinkedLists,但这并没有改变结果。错误:

错误

1 错误 C2059:语法错误:"<"

错误

2 错误 C2238:在";"之前出现意外标记

原始代码中,该文件中的任何位置都没有定义SLINKEDList,也不应在唯一包含的文件中定义,iostream

事实上,g++也会抱怨,但有一个不同的错误:

qq.cpp:8:15: error: ‘SLINKEDList’ is not a class template
    friend class SLINKEDList <E>;
                 ^

我的建议是包含定义SLINKEDList所需的任何头文件或代码,这应该可以解决您的直接问题。

更新的代码中,您可以定义它,但在使用它之后,您仍然会遇到相同的问题 - 它没有定义在应有的位置。无论如何SLINKEDListSLinkedList不同,因此您也需要修复它。

你可以通过以下方法做到这一点:

template <typename E>
class SNode{
    E elem;
    SNode<E>* next;
    friend class SLINKEDList <E>;
};

到:

template <typename E> class SLinkedList;
template <typename E> class SNode{
    E elem;
    SNode<E>* next;
    friend class SLinkedList <E>;
};

您只需从好友声明中删除<E>

friend class SLINKEDList;

如果您想知道为什么要考虑阅读本文。

这段代码有很多问题。

至少在我看来,SNode实际上应该是SLinkedList内部的嵌套类(因为,除其他外,链表类之外的任何内容都不知道它的存在)。其次,它尝试将一个名为 SLINKDEDList 的类声明为友元,但代码中不存在这样的类 - 它应该是SLinkedList的(C++区分大小写)。第三,朋友声明应该只是SLinkedList,而不是SlinkedList<E>

但是,如果你将节点类嵌套在链表类中,你根本不需要友元声明,所以结果是这样的:

template <typename E>
class SLinkedList { // a singly linked list
    struct SNode{
        E elem;
        SNode *next;
    };
public:
    SLinkedList(); // empty list constructor
    ~SLinkedList(); // destructor
    bool empty() const; // is list empty?
    const E& front() const; // return front element
    void addFront(const E& e); // add to front of list
    void removeFront(); // remove front item list
private:
    SNode *head; // head of the list
};

你也有一些地方有类似的东西 v− > elem .这需要更改为类似 v->elem 才能工作。虽然您可以在-之前或之后添加更多空格>,但->之间不能有空格。它必须键入->,而不是- >才能被识别为"指针指向"运算符。