Clion c+;中的友元函数错误+; 我编写了一个小代码来练习数据结构和漂亮的C++。p>

Clion c+;中的友元函数错误+; 我编写了一个小代码来练习数据结构和漂亮的C++。p>,c++,friend-function,class-template,C++,Friend Function,Class Template,如果将SNode中的变量公开并删除friend class…行,下面的代码可以完全正常工作。然而,根据我正在阅读的教科书,这应该可以很好地工作 我得到的错误如下: 第11行:错误:“SLinkedList”不是类模板 在“类SNode”的实例化中:第10行:错误:“类SLinkedList”需要模板参数 在“void SLinkedList::addFront(const E&)[with E=int]”的实例化中:第9行:错误:“int SNode::elem”是私有的 以下是用Clion

如果将
SNode
中的变量公开并删除
friend class…
行,下面的代码可以完全正常工作。然而,根据我正在阅读的教科书,这应该可以很好地工作

我得到的错误如下:

  • 第11行:错误:“SLinkedList”不是类模板
  • 在“类SNode”的实例化中:
    第10行:错误:“类SLinkedList”需要模板参数
  • 在“void SLinkedList::addFront(const E&)[with E=int]”的实例化中:
    第9行:错误:“int SNode::elem”是私有的
以下是用Clion编写的代码:

#include <iostream>

using namespace std;

template <typename E>
class SNode {
private:
    E elem; //line 9
    SNode<E> * next; // line 10
    friend class SLinkedList<E>; //Provide SLinkedList access to these private variables (line 11)
};



template <typename E>
class SLinkedList {
public:
    SLinkedList();
    ~SLinkedList();
    bool empty() const;
    const E& front() const;
    void addFront(const E& e);
    void removeFront();
    void printAll() const;
private:
    SNode<E> * head;
};



template <typename E>
SLinkedList<E>::SLinkedList():head(NULL){};

template <typename E>
bool SLinkedList<E>::empty() const {
    return (head==NULL);
}


template <typename E>
void SLinkedList<E>::addFront(const E &e) {
    SNode<E> * node = new SNode<E>;
    node->elem=e;
    node->next=head;
    head=node;
}

template <typename E>
void SLinkedList<E>::removeFront() {
    SNode<E> * temp = head;
    head = head->next;
    delete temp;
}


template <typename E>
const E& SLinkedList<E>::front() const {
    return head->elem;
}

template <typename E>
SLinkedList<E>::~SLinkedList() {
    while (!empty()){
        removeFront();
    }
}

template <typename  E>
void SLinkedList<E>::printAll() const {
    SNode<E> * itr =head;
    while (itr != NULL){
        cout<<itr->elem<<"  ";
        itr = itr->next;
    }
}




int main() {
    cout << "Hello, World!" << endl;
    SLinkedList<int> test ;
    test.addFront(2);
    test.addFront(3);
    test.addFront(6);
    test.addFront(8);
    test.addFront(19);
    test.printAll();



    return 0;
}
#包括
使用名称空间std;
模板
类势垒{
私人:
E elem;//第9行
SNode*next;//第10行
friend类SLinkedList;//提供对这些私有变量的SLinkedList访问(第11行)
};
模板
类链接列表{
公众:
SLinkedList();
~SLinkedList();
bool empty()常量;
常量E和前端()常量;
无效地址前端(const E&E);
void removeFront();
void printAll()常量;
私人:
斯诺德*头;
};
模板
SLinkedList::SLinkedList():head(NULL){};
模板
bool SLinkedList::empty()常量{
返回值(head==NULL);
}
模板
无效链接列表::addFront(常量E&E){
SNode*节点=新SNode;
节点->元素=e;
节点->下一步=头部;
头部=节点;
}
模板
void SLinkedList::removeFront(){
SNode*温度=头部;
头部=头部->下一步;
删除临时文件;
}
模板
常量E&SLinkedList::front()常量{
返回头->元素;
}
模板
SLinkedList::~SLinkedList(){
而(!empty()){
removeFront();
}
}
模板
void SLinkedList::printAll()常量{
SNode*itr=头部;
while(itr!=NULL){

确实很简单。我不知道这些类也必须有向前声明。
friend class SLinkedList<E>;
template <typename E> class SLinkedList;

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