gpt4 book ai didi

c++ - 类方法返回指向具有模板的类成员的指针

转载 作者:行者123 更新时间:2023-12-02 09:50:58 26 4
gpt4 key购买 nike

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

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(){

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

最佳答案

正如评论中提到的,正确的形式是:

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

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

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

为什么 typename有必要说明 in this question .基本上,它告诉编译器 LinkedList<T>::Node在模板被实例化之前是一种类型而不是其他东西。编译器需要知道这一点才能正确解析定义,但在它实际知道什么之前 T是,不能确定是否 ::Node指类型或变量或函数等。

或者,您可以使用尾随返回类型语法,其中查找将已经使用类上下文:
auto LinkedList<T>::Foo_do_something() -> Node* {

关于c++ - 类方法返回指向具有模板的类成员的指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59419034/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com