c++ - 在 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 << "\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
{
}
所以,我补充说
template <typename T>
class Node;
然后第二个错误消失了,但第一个错误仍然存在。我不确定这段代码有什么问题。有人可以帮忙吗?
解决方案
你的声明GetNode
是在类内K
,所以那里Node
是指内部类K<T>::Node
。
您的定义在类之外,因此不在类范围内查找返回类型,因此找不到。如果添加 的额外声明Node
,它会找到名称,但是还有另外两个问题:outerNode
需要一个模板参数,而且它与 inside的参数不同 。Node
K
首先,删除template <typename T> class Node;
声明,它根本不正确。
其次,您需要使返回类型引用正确的Node
. 有两种方法可以做到这一点。
从 C++11 开始,最简单的方法是使用尾随返回类型语法。
template <typename T>
auto K<T>::GetNode() -> Node*
{
}
尾随返回类型出现在范围说明符之后K<T>::
,因此编译器知道在其中查找名称K<T>
。
第二个选项是显式引用Node
inside K<T>
,但它是一个依赖类型,所以语法很糟糕:
template <typename T>
typename K<T>::Node* K<T>::GetNode()
{
}
我强烈推荐第一种方式,除非您使用的是 C++11 之前的代码库。
推荐阅读
- javascript - 对nodejs+express+mongodb应用架构
- php - 有什么方法可以获取 GitHub 存储库中每个文件的最新提交日期和时间?
- c++ - 创建我的析构函数是一种好的编程习惯吗?
- postgresql - 子查询连接中第二个查询的空值
- javascript - 如何在不从表单中删除数据的情况下重置 BootstrapValidator?
- python - 使用 Keras 每 n 批次计算验证损失
- mysql - 从整个表中检查与 sql 中的 where 子句匹配的值
- sparql - Sparql 获取属性
- asp.net-mvc - 列表
ViewModel 在 POST 方法中为空 - angular - 如何将userId传递给Angular中的标头