C++ / OpenGL: пример текстуры с растровым изображением - ошибка сужения конверсии

Я пытаюсь запустить эту текстуру для примера растрового изображения из OpenGL и получить следующую ошибку

tex_to_pix.cpp:40:1: error: narrowing conversion of ‘4294967295u’ from ‘unsigned int’ to ‘int’ inside { } [-Wnarrowing]

Ошибка относится к следующему блоку кода примера:

const int pixmap_config[] = {
    GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
    GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
    GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT,
    GLX_DOUBLEBUFFER, False,
    GLX_Y_INVERTED_EXT, GLX_DONT_CARE,
    None
};

В чем причина этой ошибки?

Это проблема с компилятором или с ++11?

Есть ли способ, которым я могу заставить мой компилятор игнорировать -Warrowing или сделать безопасное преобразование?

1 ответ

Решение

Вопрос с GLX_DONT_CARE который определяется как:

#define GLX_DONT_CARE                     0xFFFFFFFF

Потому что это значение не вписывается в 32-разрядный int, его тип unsigned int (см. этот ответ). Правила сужающего преобразования действительно были изменены в C++11.

Попытка неявно преобразовать это unsigned int в int вызывает предупреждение о сужении конверсии. Как показано в этом ответе, проблему сужения можно решить с помощью static_cast(GLX_DONT_CARE & 0xFFFFFFFF) вместо GLX_DONT_CARE

const int pixmap_config[] = {
    GLX_BIND_TO_TEXTURE_RGBA_EXT, True,
    GLX_DRAWABLE_TYPE, GLX_PIXMAP_BIT,
    GLX_BIND_TO_TEXTURE_TARGETS_EXT, GLX_TEXTURE_2D_BIT_EXT,
    GLX_DOUBLEBUFFER, False,
    GLX_Y_INVERTED_EXT, static_cast<int>(GLX_DONT_CARE & 0xFFFFFFFF),
    None
};

Кроме того, отключите сужающие ошибки преобразования в вашем компиляторе (не указано).

Другие вопросы по тегам