结构前向声明错误:使用不同类型的Typedef重定义

时间:2013-08-29 03:52:18

标签: c++ struct forward-declaration

我想在头文件中转发声明一个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;

我不能在这样的情况下转发声明吗?

2 个答案:

答案 0 :(得分:9)

GLFWvidmode不是结构,它是一个typedef。您无法转发声明typedef。选择使用未命名结构的人做出了糟糕的设计决定。

答案 1 :(得分:5)

我想提一下GLFWvidmode是匿名结构的typedef名称。如果你有意想要转发声明结构,那么你应该总是在结构中添加一个名称标签,同时将结构声明为:

    typedef struct tagname1{
    some members...;
    }tagname2;

注意dat tagname1tagname2可以相同(您可以在两个地方都使用tagname1tagnameGLFWvidmode)..现在既然如此结构现在有一个标记名(它不再是匿名的)你可以引用它来进行前向声明。

匿名结构不能用于转发声明,因为没有可引用的标记名。:)希望它有所帮助。