簡體   English   中英

如何在模板類中使用嵌套的struct / class類型作為返回值?

[英]How to use a nested struct/class type as a return value, in a template class?

我目前正在編寫一些BST模板類作為execise,但是遇到的問題使我感到困惑。

這是我的代碼寫在頭文件中,我只在這里粘貼導致錯誤的部分

template<typename Type>
class TestCls
{
    struct Node
    {
        Type data;
        Node* LeftChild;
        Node* RightChild;
    };
    Node* pRoot;
public:
    Node* GetNode(Node*& someroot);
};

template<typename Type>
Node * TestCls<Type>::GetNode(Node*& someroot)
{
    return NULL;
}

我使用VS2015進行編譯,然后出現如下錯誤:

錯誤C2059語法錯誤:''錯誤C2923'TestCls':'類型'不是參數'類型'的有效模板類型參數
錯誤C2923'TestCls':'類型'不是參數'類型'的有效模板類型參數
錯誤C2065'類型':未聲明的標識符
錯誤C2065'類型':未聲明的標識符

似乎編譯器無法識別GetNode()函數定義的開頭的“ Node * ”。

但是,如果我使用像這樣的自動返回類型:

auto TestCls<Type>::GetNode(Node*& someroot)->Node*&
{
    return NULL;
}

該代碼將成功編譯。

那么第一個版本有什么問題? 如何正確使用嵌套的struct / class類型作為返回值?

template<typename Type>
typename TestCls<Type>::Node * TestCls<Type>::GetNode(Node*& someroot)

Node的作用域在類模板內。 typename是必需的,因為它是取決於Type參數的Type 在尾隨返回類型的情況下,這一切都可以避免,因為它會在TestCls<Type>::GetNode已指定的范圍內查找Node

問題是當你寫

template<typename Type>
Node * TestCls<Type>::GetNode(Node*& someroot)
{
    return NULL;
}

什么是方法的名稱( GetNode )是類的名稱解析的范圍之外。 所以你必須明確

template<typename Type>
typename TestCls<Type>::Node * TestCls<Type>::GetNode(Node*& someroot)
{
    return NULL;
}

但是,如果我使用像這樣的自動返回類型,則代碼將成功編譯。

究竟。

因為使用auto ,所以您在方法名稱之后編寫Node ,所以您處於類的作用域解析中,因此無需顯式顯示它。

暫無
暫無

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

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