C++ 在visual studio代码上运行时出现问题:C++;声明与,

C++ 在visual studio代码上运行时出现问题:C++;声明与,,c++,C++,这是我的源代码,我得到了一个错误 “C++声明与(在第36行声明的)不兼容 和 C++标识符“节点”未定义。 #include <iostream> template <typename T> class K { private: class Node { public: Node() { next = prev = nullptr; } Node(int

这是我的源代码,我得到了一个错误 “C++声明与(在第36行声明的)不兼容 和 C++标识符“节点”未定义。
#include <iostream>

template <typename T>
class K
{
private:
    class Node
    {
    public:
        Node() 
        {
            next = prev = nullptr;
        }
        Node(int _x)
            : Data(_x)
        {
            next = prev = nullptr;
        }
        int Data;
        Node* next, *prev;
    };
public:
    K() 
    {
        std::cout << "\n\t Hi, I am K \n";
    }
    ~K()
    {
        std::cout << "\n\t Bye, i Was K \n";
    }
    void Call(int _x)
    {
        std::cout << "\n\t Called K" << _x << "\n";
    }

    Node* GetNode();

};

template <typename T>
class Node;
template <typename T>
Node* K<T>::GetNode() // Here I get error 
{

}
#包括
模板
K类
{
私人:
类节点
{
公众:
节点()
{
next=prev=nullptr;
}
节点(int_x)
:数据(_x)
{
next=prev=nullptr;
}
int数据;
节点*next,*prev;
};
公众:
K()
{

std::cout您对
GetNode
的声明在类
K
中,因此
Node
引用内部类
K::Node

您的定义在类之外,因此返回类型不会在类范围内查找,因此也找不到。如果添加
节点
的额外声明,它会找到名称,但还有两个问题:外部
节点
需要模板参数,并且它只是与该节点不同的
节点
内部
K

首先,删除
模板类节点;
声明,它根本不正确

其次,您需要使返回类型引用正确的
节点

自C++11以来,最简单的方法是使用尾部返回类型语法

template <typename T>
auto K<T>::GetNode() -> Node*
{
}

我强烈推荐第一种方法,除非您使用的是C++11之前的代码库。

我真诚地感谢您的帮助。!我可能很守旧,但我认为写下并理解第二种方法很重要,因为这就是实际发生的情况(这就是我们正在谈论的
节点,是的,无论好坏,它都是一个从属名称!)@Peter Monica“因为这就是实际发生的事情”-我不会这样描述它。这不像编译器将尾部返回类型版本转换为经典版本。@SebastianRedl好吧,在某种程度上,它推断出了在C++11之前的代码中指定的类型!显然。你不同意吗?就像你自己说的:因为尾部返回类型可能在它找到的函数声明
K::Node
@Peter>,您是否还会教新程序员在类中编写声明为
K::Node GetNode()
,或者编写函数定义,参数为
void K::AddNode(typename K::Node Node)
,以便他们知道“真正发生了什么”唯一的关于返回类型的事情是C++的奇怪解析规则将它置于定义的函数的范围之外。
template <typename T>
auto K<T>::GetNode() -> Node*
{
}
template <typename T>
typename K<T>::Node* K<T>::GetNode()
{
}