【问题标题】:forward declaration of struct doesn't work - can't figure out whystruct 的前向声明不起作用 - 不知道为什么
【发布时间】:2018-08-09 12:31:03
【问题描述】:

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

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++ 书籍。您正在尝试在这里编程 C,而不是 C++。在 C++ 中,struct XX 已经命名相同的类型,但没有 typedef
  • struct BEAST_Vertex 之前定义struct BEAST_Coord2D 它将起作用,因为您声明了它们但没有定义它们
  • @TCouch:不是重复的。链接的问题取决于成员的使用,但 typedef 不需要成员。
  • @Slava Yes it does

标签: c++ struct forward-declaration


【解决方案1】:

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

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

如果 BEAST_Vertex 只声明 pointersBEAST_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;

您所做的是将前向声明与typedef (一个用于消除之后到处写struct 的需要)混合在一起,这在 C++ 中完全有效但不是必需的(首先不需要你一直写struct)。

【讨论】:

    猜你喜欢
    • 2014-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-05-14
    • 2017-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多