首页 > 解决方案 > 结构的前向声明不起作用 - 无法弄清楚为什么

问题描述

我正在尝试对结构进行前向声明。但它不起作用。

typedef struct BEAST_Coord2D BEAST_Coord2D;
typedef struct BEAST_Vertex BEAST_Vertex;

struct BEAST_Vertex {
    BEAST_Coord2D absolut;
    BEAST_Coord2D relativ;
};

struct BEAST_Coord2D {
    float x;
    float y;
};

Visual Studio 2017 说:“错误 C2079:'BEAST_Vertex::absolut' 使用未定义的结构 'BEAST_Coord2D' 错误 C2079:'BEAST_Vertex::relativ' 使用未定义的结构 'BEAST_Coord2D'

我为我的所有结构制作了一个简单的头文件。这里有什么问题?

最佳星牛

标签: c++structforward-declaration

解决方案


前向声明一个类允许你用它做一些事情,但不是所有事情。

声明该类的实例不是其中之一。执行此操作需要更多信息,而不仅仅是其名称;您需要先提供其实际定义。

如果BEAST_Vertex只声明指向的指针BEAST_Coord2D那么你就可以了(编译器总是知道指针是什么)。

幸运的是,至少在这个人为的例子中,修复很简单:交换类定义并删除前向声明:

struct BEAST_Coord2D
{
    float x;
    float y;
};

struct BEAST_Vertex
{
    BEAST_Coord2D absolut;
    BEAST_Coord2D relativ;
};

顺便说一句,您在这里使用了不必要的 C 习语。C++ 前向声明如下所示:

struct BEAST_Coord2D;
struct BEAST_Vertex;

相反,您所做的是将前向声明与 a typedef(用于消除struct之后到处写的需要的 C 习惯用法)混合在一起,这在 C++ 中是完全有效的,但不是必需的(这不需要您struct在第一名)。


推荐阅读