2016-09-15 9 views
0

Итак, я изначально пытаюсь сделать некоторые базовые вещи OpenGL (freeglut) на C++, но я попал в ловушку. Я получаю следующее сообщение об ошибке:Какова должна быть подпись метода для работы с glutDisplayFunc()?

.../TextureMapper.cpp: In member function 'void TextureMapper::run()': 
.../TextureMapper.cpp:67:28: error: cannot convert 'TextureMapper::display' from type 'void* (TextureMapper::)()' to type 'void (*)()' 
     glutDisplayFunc(display); 
          ^ 

Я думаю, что мне нужно display быть указатель на функцию (или как там оно называется, я не очень знаком с этим понятием). Однако я делаю это неправильно. Я никогда не использовал указатель функции раньше, и, к сожалению, сообщение об ошибке ничего не значит для меня, и я не могу понять документацию, которую я прочитал. Я программист на Java, поэтому для меня это очень чуждо.

Вот декларация для функции члена в TextureMapper.h:

void* display(void); 

И конкретизация (не помню, как это называется либо) в TextureMapper.cpp:

void* TextureMapper::display(void) 
{ 
    ... 
} 

Я заметил, что CLion предупреждал об этом, но я также пробовал это первым:

void display(); 

Но это дало аналогичную ошибку.

Вот где я пытаюсь вызвать glutDisplayFunc:

void TextureMapper::run() 
{ 
    /* Run GL */ 
    glutDisplayFunc(display); 
    glutMainLoop(); 
} 
+0

'TextureMapper' является классом. 'display' и' run' являются функциями-членами внутри. –

+0

Обратите внимание, что 'void display();' имеет правильную подпись. Вам нужна функция без возвращаемого значения (т. Е. Указатель функции void (*)() '), но' void * display(); 'будет возвращать' void * '. – user4407569

ответ

3

glutDisplayFunc ожидает указатель на функцию C. Этот указатель не может исходить из нестационарной функции-члена, потому что в C++ функции-члены искажены.

Для того, чтобы сделать эту работу, одним из решений является определение вашего TextureMapper::Display как статической функции-члена.

Так, попробовать что-то вроде этого:

class TextureMapper 
{ 
public: 
    static void display(void); 
    .... 
}; 

и texturemapper.cpp

void TextureMapper::display(void) { \* implementation here *\} 
+0

Направил меня в правильном направлении. Мне также нужно было использовать переменные, хранящиеся в «TextureMapper», чтобы знать, что рисовать, поэтому мне пришлось обратиться к связанному дублирующему вопросу: http://stackoverflow.com/questions/3589422/using-opengl-glutdisplayfunc-within-class –