首页 > 解决方案 > 类方法返回指向具有模板的类成员的指针

问题描述

我正在尝试为具有自己的类“Node”的类“LinkedList”编写一个函数。“LinkedList”类是一个模板类。我正在尝试编写一个函数“Foo_do_something”,它返回一个指向“节点”的指针。以下是代码:

template <typename T>
class LinkedList{
public:
    class Node {
    public:
        T data;
        Node *next;
        Node *prev;

        Node(): next(nullptr), prev(nullptr) {}
        Node(const T & data): data(data), next(nullptr), prev(nullptr) {}
    };
public:
    Node* Foo_do_something();
};

template <typename T>
Node* LinkedList<T>::Foo_do_something(){
    std::cout<<"Hello";
    Node *ptr = new Node(100);
    return ptr;
}

使用此代码,我得到错误:

error: ‘Node’ does not name a type

我知道这是因为“节点”属于“LinkedList”类范围。所以我需要以某种方式添加这些信息。我尝试了以下代码,但这也会引发错误。

LinkedList<T>::Node* LinkedList<T>::Foo_do_something(){

我可以理解,如果我在类中定义函数,那么问题就可以解决。但我试图将函数的实现分开。有没有办法做到这一点?

标签: c++classpointerstemplates

解决方案


如评论中所述,正确的形式是:

typename LinkedList<T>::Node* LinkedList<T>::Foo_do_something() {

最近的编译器还会告诉您,typename如果您尝试在没有它的情况下编译它,您需要它。

原因LinkedList<T>::是必要的,因为在编译器到达之前解析返回类型LinkedList<T>::Foo_do_something并知道您正在为哪个类定义成员函数,从而知道在哪里寻找Node.

为什么typename有必要在这个问题中解释。基本上,它在模板被实例化之前告诉编译器这LinkedList<T>::Node是一个类型而不是别的东西。编译器需要知道这一点才能正确解析定义,但在它真正知道是什么之前T,它无法确定是::Node指类型还是变量或函数等。

或者,您可以使用尾随返回类型语法,其中查找已经使用类上下文:

auto LinkedList<T>::Foo_do_something() -> Node* {

推荐阅读