将类集枚举更改为非类集枚举
Posted
技术标签:
【中文标题】将类集枚举更改为非类集枚举【英文标题】: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.
【参考方案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" 是什么意思了!以上是关于将类集枚举更改为非类集枚举的主要内容,如果未能解决你的问题,请参考以下文章