簡體   English   中英

為什么我不能在類之外定義一個返回類型為“指向結構的指針”的函數?

[英]why can't i define a function of return type 'pointer to struct' outside of class?

此代碼給出錯誤“沒有聲明匹配 Node* List::getNewNode(int)”

class List
{
private:
    struct Node {
        int data;
        Node* next;
    };

private:
    Node* getNewNode(int data);
};

Node* List::getNewNode(int data)
{
    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = NULL;
    return newNode;
}

但是這個函數的相同定義在類內部起作用

class List
{
private:
    struct Node {
        int data;
        Node* next;
    } *head = NULL;

private:
    Node* getNewNode(int data)
    {
        Node* newNode = new Node;
        newNode->data = data;
        newNode->next = NULL;
        return newNode;
    }
};

在類聲明的括號內定義函數和使用范圍解析在類括號外定義函數或返回類型有問題嗎? 編譯器:minGW x64

如果在類定義之外定義函數,則必須提供Node的解析(因為它是嵌套類):

List::Node* List::getNewNode(int data)
{
    Node* newNode = new Node;
    newNode->data = data;
    newNode->next = nullptr;
    return newNode;
}

這是 C++ 中奇怪的元素之一。 問題是解析器不(不允許)知道您正在使用 List 的子類。 相反,它在全局命名空間和所有使用的命名空間中搜索類 Node。

要解決此問題,您應該在類型前加上列表。

 List::Node* List::getNewNode(int data)

如今,您還可以使用尾隨返回類型來指定您的函數。

 auto List::getNewNode(int data) -> Node*

由於 Node 現在在函數之后,解析器已經知道您在 List 范圍內並且可以找到正確的類。 連同這種簡化,一些人認為這是一種更一致的代碼編寫方式,因為它類似於 lambda 的工作方式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM