一个方法的签名必须是与glutDisplayFunc()一起工作



所以,我最初试图做一些基本的OpenGL(免费)的东西在c++中,但我遇到了一个障碍。我得到以下错误:

.../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)
{
    ...
}

我注意到cllion给了我一个关于这种类型的警告,但我也先试了这个:

void display();

但是它给出了一个类似的错误。

这里是我试图调用glutDisplayFunc的地方:

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

glutDisplayFunc需要一个C函数指针。这个指针不能来自于非静态成员函数,因为在c++中,成员函数是乱码的。

因此,为了能够使此工作,一个解决方案是将TextureMapper::Display定义为静态成员函数。

那么,试试这样写:

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

and in texturemapper.cpp

void TextureMapper::display(void) { * implementation here *}

最新更新