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
};
Кроме того, отключите сужающие ошибки преобразования в вашем компиляторе (не указано).