如何清除错误:X不是类模板

Pra*_*nav 2 templates c++11

我不是使用模板的专家,但是我不确定为什么要error: 'SLinked_List' is not a class template: friend class SLinked_List<T>;使用class的定义SNode。这段代码有什么问题?

谢谢你,普拉纳夫

#include <iostream>
#include <string>

template <typename T>
class SNode{
    friend class SLinked_List<T>;
private:
    T data;
    SNode<T>* next;
};

template <typename T>
class SLinked_List{

private:
    SNode<T>* head;

public:
    SLinked_List(){
        head = nullptr;
    }

    bool empty() const { return head == nullptr; }

    void insert_first (const T&);

};

template <typename T>
void SLinked_List<T> :: insert_first (const T& t){
    SNode<T>* node = new SNode<T>;
    node->data = t;
    node->next = head;
    head = node;
}

int main(){

    SLinked_List<std::string> ls;

    ls.insert_first("Hello");

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

0x4*_*2D2 5

当您使用模板参数来引用名称时,您是在说此类型已经作为模板存在,我想引用该模板的特定专业化名称。里面SNodeSLinked_List还没有宣布呢,所以这不能被允许的,因为编译器甚至不知道这是否是一个模板呢。

很显然,您想和接受专业知识T,所以需要在声明SLinked_List之前SNode

template <typename T>
class SLinked_List;

template <typename T>
class SNode{
    friend class SLinked_List<T>;
private:
    T data;
    SNode<T>* next;
};
Run Code Online (Sandbox Code Playgroud)

现在,编译器知道这SLinked_List是一个模板,可以这样引用。