我有一个在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风格指南后,我想更改私有/公共块的顺序。然后看起来像这样:
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;
谁能解释为什么私有/公共块顺序更改会导致编译器错误,以及为什么在类型前面添加
::
时错误消失? 最佳答案
首先,不清楚为什么将成员函数命名为AURenderCallbackStruct,该成员函数与相应结构的名称一致,并且看起来像结构构造函数。
问题是这个愚蠢的名字。
在第一种情况下,编译器认为您确实定义了隐藏该结构的相应名称的成员函数。
在第二种情况下,编译器认为您试图调用该结构的构造函数。
只需重命名不会产生歧义的函数即可。
关于c++ - C++类 namespace 怪异,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/25095208/