C++类命名空间怪异

标签 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 风格指南后,我想更改私有(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/

相关文章:

c++ - 扫雷。递归检查时的段错误

c++ - OSX 缺少 memalign

python - 在 Python 中获取 Tkinter 窗口外的鼠标事件

asp.net-mvc - 在 View 中使用 "ObjectName"而不是 "Namespace.ObjectName"

javascript - 支持命名空间 xml 的 AJAX 库

c++ - 支持 CUDA 统一内存系统分配器的操作系统版本?

c++ - 如何将 makefile 转换为 JSON 编译数据库?

apache - 使用 MAMP 测试 HTTPS 文件

namespaces - 具有多态关系的命名空间 Laravel 5

c++ - 使用用于 C++ 代码的 header 编译 C 代码时未知类型名称 char16_t