将类集枚举更改为非类集枚举

时间:2013-07-07 20:34:35

标签: c++ c qt

我有错误:

error: cannot convert 'AudioEngine::input' from type 'mad_flow (AudioEngine::)(void*, mad_stream*)' to type 'mad_flow (*)(void*, mad_stream*)'

我有枚举,

enum mad_flow AudioEngine::input(void *data, mad_stream *stream)
{
    etc...
}

外部库正在调用它,

mad_decoder_init(&decoder, &player,
                 input, decode_header, decode_filter, process_output,
                 decode_error, 0 /* message */);

外部类需要输入,但我想保持我的引擎类。我怎么能这样做?

非常感谢。

1 个答案:

答案 0 :(得分:0)

您应该将您的功能设为静态成员。您的类声明如下所示:

class AudioEngine
{
    ...    
    enum mad_flow input(void *data, mad_stream *stream);
    ...
};

你应该这样做:

class AudioEngine
{
    ...    
    static enum mad_flow input(void *data, mad_stream *stream);
    ...
};

mad_decoder_init(...
                 &AudioEngine::input,
                 ...);

实际上,为了使C ++函数可以从C调用,应该在类之外声明它,并在其前面添加extern "C"

class AudioEngine
{
    ...    
    static enum mad_flow input(void *data, mad_stream *stream);
    ...
};

extern "C" enum mad_flow AudioEngine_input_callback(void *data, mad_stream *stream)
{
    return AudioEngine::input(data, stream);
}

mad_decoder_init(...
                 AudioEngine_input_callback,
                 ...);

但是,实际上,第一个解决方案(只是将static添加到成员函数的声明中)将起作用。