[英]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.