【问题标题】:How to use a nested struct/class type as a return value, in a template class?如何在模板类中使用嵌套的结构/类类型作为返回值?
【发布时间】:2018-07-16 20:22:13
【问题描述】:

我目前正在编写一些 BST 模板类作为执行 但是我遇到的一个问题让我很困惑。

这是我写在头文件中的代码 我这里只粘贴导致错误的部分

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”的有效模板类型参数
错误 C2923“TestCls”:“Type”不是参数“Type”的有效模板类型参数
错误 C2065“类型”:未声明的标识符
错误 C2065“类型”:未声明的标识符

编译器似乎无法识别 GetNode() 函数定义头部的“Node *”。

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

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

代码将编译成功。

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

【问题讨论】:

    标签: c++ c++11 templates auto


    【解决方案1】:

    问题是当你写的时候

    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,所以你在类的范围解析中,所以不需要显式。

    【讨论】:

    • @KillzoneKid - 你是对的;我系统地忘记了typename;谢谢。
    【解决方案2】:
    template<typename Type>
    typename TestCls<Type>::Node * TestCls<Type>::GetNode(Node*& someroot)
    

    Node 在类模板中作用域。 typename 是必需的,因为它是一种依赖于 Type 参数的类型。使用尾随返回类型案例可以避免这一切,因为它会在您已在 TestCls&lt;Type&gt;::GetNode 中指定的范围内查找 Node

    【讨论】:

      猜你喜欢
      • 2011-03-26
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2014-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多