我有一个在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;
任何人都可以解释为什么私有/公共区块的顺序更改会产生编译器错误,以及为什么在类型前面添加::
时错误会消失?
答案 0 :(得分:4)
首先,不清楚为什么将成员函数命名为AURenderCallbackStruct,它与相应的结构名称一致,看起来像结构构造函数。 问题是这个愚蠢的名字。
在第一种情况下,编译器认为您确实定义了隐藏结构的相应名称的成员函数。 在第二种情况下,编译器认为您尝试调用结构的构造函数。
只需重命名不存在歧义的函数。