我想在头文件中转发声明一个struct。
struct GLFWvidmode;
class DesktopVideoMode {
private:
const GLFWvidmode *videomode;
public:
DesktopVideoMode(const GLFWvidmode *videomode);
...
在cpp文件中,我包含带有定义的外部标题......
#include "DesktopVideoMode.hpp"
#include <GLFW/glfw3.h>
...错误“ Typedef重新定义不同类型('struct GLFWvidmode'vs'GLFWvidmode')”发生在哪里:
typedef struct
{
/*! The width, in screen coordinates, of the video mode.
*/
int width;
/*! The height, in screen coordinates, of the video mode.
*/
int height;
/*! The bit depth of the red channel of the video mode.
*/
int redBits;
/*! The bit depth of the green channel of the video mode.
*/
int greenBits;
/*! The bit depth of the blue channel of the video mode.
*/
int blueBits;
/*! The refresh rate, in Hz, of the video mode.
*/
int refreshRate;
} GLFWvidmode;
我不能在这样的情况下转发声明吗?
答案 0 :(得分:9)
GLFWvidmode
不是结构,它是一个typedef。您无法转发声明typedef。选择使用未命名结构的人做出了糟糕的设计决定。
答案 1 :(得分:5)
我想提一下GLFWvidmode
是匿名结构的typedef名称。如果你有意想要转发声明结构,那么你应该总是在结构中添加一个名称标签,同时将结构声明为:
typedef struct tagname1{
some members...;
}tagname2;
注意dat tagname1
和tagname2
可以相同(您可以在两个地方都使用tagname1
或tagname
或GLFWvidmode
)..现在既然如此结构现在有一个标记名(它不再是匿名的)你可以引用它来进行前向声明。
和是匿名结构不能用于转发声明,因为没有可引用的标记名。:)希望它有所帮助。