我有一个在 OS X 上使用 Core Audio 结构的 C++ 类。 我最初的实现是这样的:
class MyClass
{
private:
AUNode _converterNode;
AURenderCallbackStruct _renderCBStruct;
public:
MyClass();
~MyClass();
inline AUNode* getConverterNode() { return &_converterNode; }
inline AURenderCallbackStruct* AURenderCallbackStruct() { return &_renderCBStruct; }
};
阅读 Poco 风格指南后,我想更改私有(private)/公共(public) block 的顺序。然后看起来像这样:
class MyClass
{
public:
MyClass();
~MyClass();
inline AUNode* getConverterNode() { return &_converterNode; }
inline AURenderCallbackStruct* AURenderCallbackStruct() { return &_renderCBStruct; }
private:
AUNode _converterNode;
AURenderCallbackStruct _renderCBStruct;
};
编译器现在告诉我类型 AURenderCallbackStruct
未知,并告诉我用 ::AURenderCallbackStruct
替换类型名称。当我这样做时,没有编译器错误。
奇怪的是,这只出现在`AURenderCallbackStruct 而不是 AUNode。
AURenderCallbackStruct 定义如下:
typedef struct AURenderCallbackStruct {
AURenderCallback inputProc;
void * inputProcRefCon;
} AURenderCallbackStruct;
AUNode 的定义如下:
typedef SInt32 AUNode;
谁能解释为什么改变私有(private)/公共(public) block 的顺序会产生编译器错误,以及为什么在类型前面添加 ::
时错误会消失?
最佳答案
首先不清楚为什么将成员函数命名为AURenderCallbackStruct 与相应结构的名称一致,看起来像结构构造函数。 问题是这个愚蠢的名字。
在第一种情况下,编译器认为您确实定义了隐藏相应结构名称的成员函数。 在第二种情况下,编译器认为您试图调用结构的构造函数。
简单地重命名函数,不会有歧义。
关于C++类命名空间怪异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25095208/