【问题标题】:C++ class namespace weirdnessC++ 类命名空间怪异
【发布时间】:2014-09-25 12:59:29
【问题描述】:

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

谁能解释为什么私有/公共块的顺序更改会产生编译器错误以及为什么在类型前添加::时错误消失?

【问题讨论】:

  • 您能解释一下 C-tag 是如何应用的吗?
  • 我认为 CoreAudio 类型是本机 C 类型,但我想你是对的。将删除标签。

标签: c++ macos namespaces core-audio


【解决方案1】:

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

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

只需重命名函数就不会产生歧义。

【讨论】:

  • 该死的......我完全错过了。这完全有道理 ;-) 感谢和抱歉这个愚蠢的问题!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-26
  • 1970-01-01
  • 1970-01-01
  • 2021-08-29
  • 2021-11-22
  • 2011-05-03
  • 2013-02-22
相关资源
最近更新 更多