C++ 在visual studio代码上运行时出现问题:C++;声明与,
这是我的源代码,我得到了一个错误 “C++声明与(在第36行声明的)不兼容 和 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
#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()
{
}