首页 > 解决方案 > 在 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;

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

标签: c++

解决方案


你的声明GetNode是在类内K,所以那里Node是指内部类K<T>::Node

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

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

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

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

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

尾随返回类型出现在范围说明符之后K<T>::,因此编译器知道在其中查找名称K<T>

第二个选项是显式引用Nodeinside K<T>,但它是一个依赖类型,所以语法很糟糕:

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

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


推荐阅读