如何在模板类中使用嵌套的结构/类类型作为返回值

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

本文关键字:结构 类型 返回值 嵌套      更新时间:2023-10-16

我当前将一些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':'type'不是参数'type'type'
的有效模板类型参数错误c2923'testcls':'type'不是参数'type'type'
的有效模板类型参数错误C2065'类型':未申报的标识符
错误C2065'类型':未申报的标识符

看来GetNode()函数定义头的" Node *"未被编译器识别。

但是,如果我使用这样的自动返回类型:

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

代码将成功编译。

那么第一个版本中有什么问题?如何正确使用嵌套的结构/类类型作为返回值?

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

Node在类模板内范围内。需要typename,因为它是一种取决于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,因此您处于类的范围分辨率,因此无需阐明它。