c++ - 结构的前向声明不起作用 - 无法弄清楚为什么
问题描述
我正在尝试对结构进行前向声明。但它不起作用。
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'
我为我的所有结构制作了一个简单的头文件。这里有什么问题?
最佳星牛
解决方案
前向声明一个类允许你用它做一些事情,但不是所有事情。
声明该类的实例不是其中之一。执行此操作需要更多信息,而不仅仅是其名称;您需要先提供其实际定义。
如果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
在第一名)。
推荐阅读
- php - 电子邮件唯一验证规则在 laravel 中不起作用
- javascript - vue中的路由器未定义
- c# - 无法加载文件或程序集 mongocrypt
- javascript - 从圆心开始的css 3D垂直线
- c# - 如何使用美国英文字符执行数据清理和替换 unicode (LATIN) carachters
- javascript - 使用onclick在循环中按ID删除元素 - jquery
- python - 如何在没有足够 RAM 的情况下使用 Pandas 打开巨大的镶木地板文件
- python - Django- [WinError 10013]
- c# - 在第一个下拉列表中选择该项目时,如何从第二个下拉列表中删除该项目?
- android - java中的布局setVisibility()没有效果