繁体   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