Ошибка структурного прямого объявления: переопределение Typedef с различными типами
Я хочу переслать объявление структуры в заголовочном файле.
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 ответа
GLFWvidmode
это не структура, это typedef. Вы не можете форвард-декларировать typedef. Кто бы ни решил использовать неназванную структуру, принял плохое дизайнерское решение.
Я хотел бы отметить, что GLFWvidmode
является именем typedef для анонимной структуры. Если вы намеренно хотите переслать объявление структуры, вы всегда должны добавлять тег имени в структуру, объявляя структуру следующим образом:
typedef struct tagname1{
some members...;
}tagname2;
примечание дата tagname1
а также tagname2
может быть таким же (вы можете использовать tagname1
или же tagname
или же GLFWvidmode
в обоих местах).. и теперь, поскольку структура теперь имеет тэг (он больше не анонимный), вы можете ссылаться на него для прямого объявления.
и да, анонимная структура не может быть использована для прямого объявления, так как нет тега, на который можно сослаться..:) надеюсь, это поможет.