2

我想在头文件中转发声明一个结构。

struct GLFWvidmode;

class DesktopVideoMode {
private:
    const GLFWvidmode *videomode;
public:
    DesktopVideoMode(const GLFWvidmode *videomode);
...

在 cpp 文件中,我将外部标头包含在定义中...

#include "DesktopVideoMode.hpp"
#include <GLFW/glfw3.h>

...发生错误“ Typedef reddefinition with different types ('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;

在这种情况下我不能转发申报吗?

4

2 回答 2

10

GLFWvidmode不是结构,而是类型定义。您不能前向声明 typedef。选择使用未命名结构的人做出了糟糕的设计决定。

于 2013-08-29T03:54:13.730 回答
6

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

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

注意 dattagname1并且tagname2可以相同(您可以在这两个地方使用tagname1ortagname或或GLFWvidmode ).. 现在由于该结构现在具有标记名(它不再是匿名的),您可以引用它进行前向声明。

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

于 2013-09-06T15:39:48.487 回答