【问题标题】:Class method returning a pointer to a member of class with Template类方法返回指向具有模板的类成员的指针
【发布时间】:2020-04-12 14:24:41
【问题描述】:

我正在尝试为具有自己的类“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(){

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

【问题讨论】:

  • 试试typename LinkedList&lt;T&gt;::Node*

标签: c++ class pointers templates


【解决方案1】:

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

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

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

之所以需要LinkedList&lt;T&gt;::,是因为返回类型在编译器到达LinkedList&lt;T&gt;::Foo_do_something 之前就已被解析,并且知道您为哪个类定义成员函数,从而知道在哪里寻找Node

in this question 解释了为什么需要 typename。基本上,它在模板被实例化之前告诉编译器LinkedList&lt;T&gt;::Node 是一个type 而不是别的东西。编译器需要知道才能正确解析定义,但在真正知道T 是什么之前,无法确定::Node 是指类型还是变量还是函数等。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2015-01-16
    • 2011-08-02
    • 1970-01-01
    • 2013-02-15
    相关资源
    最近更新 更多