【问题标题】:Changing Class-set Enum to Non Class-set Enum将类集枚举更改为非类集枚举
【发布时间】:2013-07-07 20:34:34
【问题描述】:

我有错误:

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

外部类需要输入,但我想保持我的引擎类为基础。我该怎么做?

非常感谢。

【问题讨论】:

  • 您实际上是在问“我如何从 C 中调用成员函数?”?
  • 可能。我真的不知道。
  • 嗯,如果你真的不知道你在问什么,这将很难回答;)你能提供一些上下文(例如一些周围的代码)吗?
  • madSdecoder_init 来自 libmad,它非常希望以自己的方式枚举 - 即枚举 mad_flow 输入(void data, mad_stream 流)。但是,枚举在我的类中使用了变量,所以我需要将它包装在类中。
  • 好的,简单看一下documentation 会发现mad_decoder_init 期待一个回调(即一个函数指针),而不是一个enum.

标签: c++ c qt


【解决方案1】:

你应该让你的函数成为一个静态成员。您的类声明如下所示:

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

【讨论】:

  • 非常感谢。我现在正在查看是否可以修补 QAudioDecoder,但如果失败,我相信这肯定会有所帮助。不管怎样,我现在终于明白 extern "C" 是什么意思了!
猜你喜欢
  • 2012-02-18
  • 2013-01-10
  • 2015-09-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多