0

我有错误:

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 */);

外部类需要来自该输入的输入,但我想保持基于引擎类。我怎样才能做到这一点?

非常感谢。

4

1 回答 1

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在成员函数的声明之前)将起作用。

于 2013-07-07T22:19:45.250 回答