Объявление метода меняет значение символа

Для следующего кода:

struct foo {};

struct A
{
typedef foo foo_type;

void foo();
};

GCC выдает ошибку компилятора:

test.cpp:7:14: error: declaration of 'void A::foo()' [-fpermissive]
void foo();
^
test.cpp:1:8: error: changes meaning of 'foo' from 'struct foo' [-fpermissive]
struct foo {};
^

Но Clang принимает это без ошибок компилятора. Кто прав?

Обратите внимание, что если typedef удален или изменен на typedef ::foo foo_type, и gcc, и clang принимают код.

17

Решение

GCC правильно, но Clang не требуется для диагностики (3.3.7):

Имя N, используемое в классе S, должно ссылаться на то же объявление в его
контекст и при переоценке в завершенном объеме S. Нет
Диагностика необходима для нарушения этого правила.

Это из-за того, как работает класс. foo из void foo(); виден внутри все Сфера класса Aпоэтому декларация void foo(); меняет смысл foo в typedef со ссылкой на struct foo к названию функции foo,

17

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

Других решений пока нет …

По вопросам рекламы [email protected]