我在visual studio代码上运行时遇到问题.:C++声明与、不兼容



这是我的源代码,我得到了一个错误"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 << "nt Hi, I am K n";
}
~K()
{
std::cout << "nt Bye, i Was K n";
}
void Call(int _x)
{
std::cout << "nt Called K" << _x << "n";
}
Node* GetNode();
};
template <typename T>
class Node;
template <typename T>
Node* K<T>::GetNode() // Here I get error 
{
}

所以,我添加了

template <typename T>
class Node;

则第二个错误消失,但第一个错误仍然存在。我不确定这个代码出了什么问题。有人能帮忙吗?

您对GetNode的声明在类K内,因此Node引用内部类K<T>::Node

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

首先,删除template <typename T> class Node;声明,它根本不正确。

其次,您需要使返回类型引用正确的Node。有两种方法可以做到这一点。

从C++11开始,最简单的方法就是使用尾随返回类型语法。

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

尾部返回类型位于作用域说明符K<T>::之后,因此编译器知道要在K<T>中查找名称。

第二种选择是在K<T>中显式引用Node,但它是一个依赖类型,因此语法很糟糕:

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

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

最新更新