AURenderCallbackStruct

AURenderCallbackStruct

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

10-10 02:30