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