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

Changing Class-set Enum to Non Class-set Enum

本文关键字:枚举      更新时间:2023-10-16

我有错误:

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

外部类中需要来自它的输入,但我希望保持我的引擎类为基础。我该怎么做?

非常感谢。

您应该使函数成为静态成员。您的类声明如下:

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)会起作用。