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 に答える