У меня есть класс 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;
Может кто-нибудь объяснить, почему изменение порядка частного / публичного блока приводит к ошибке компилятора и почему ошибка исчезает при добавлении ::
перед типом?
Прежде всего, непонятно, почему вы назвали функцию-член AURenderCallbackStruct, которая совпадает с именем соответствующей структуры и выглядит как конструктор структуры.
Проблема в этом глупом имени.
в первом случае компилятор считает, что вы действительно определяете функцию-член, которая скрывает соответствующее имя структуры.
Во втором случае компилятор думает, что вы пытаетесь вызвать конструктор структуры.
Просто переименуйте функцию, чтобы не было двусмысленности.