C ++类命名空间怪异

时间:2014-08-02 12:48:51

标签: c++ macos namespaces core-audio

我有一个在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;

任何人都可以解释为什么私有/公共区块的顺序更改会产生编译器错误,以及为什么在类型前面添加::时错误会消失?

1 个答案:

答案 0 :(得分:4)

首先,不清楚为什么将成员函数命名为AURenderCallbackStruct,它与相应的结构名称一致,看起来像结构构造函数。 问题是这个愚蠢的名字。

在第一种情况下,编译器认为您确实定义了隐藏结构的相应名称的成员函数。 在第二种情况下,编译器认为您尝试调用结构的构造函数。

只需重命名不存在歧义的函数。