macos — странность пространства имен класса C ++

У меня есть класс C ++, использующий структуры Core Audio на OS X.
Моя первоначальная реализация была такой:

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

Решение

Прежде всего, непонятно, почему вы назвали функцию-член AURenderCallbackStruct, которая совпадает с именем соответствующей структуры и выглядит как конструктор структуры.
Проблема в этом глупом имени.

в первом случае компилятор считает, что вы действительно определяете функцию-член, которая скрывает соответствующее имя структуры.
Во втором случае компилятор думает, что вы пытаетесь вызвать конструктор структуры.

Просто переименуйте функцию, чтобы не было двусмысленности.

4

Другие решения


По вопросам рекламы ammmcru@yandex.ru
Adblock
detector