问题
For the following code:
struct foo {};
struct A
{
typedef foo foo_type;
void foo();
};
GCC gives a compiler error:
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 {};
^
But clang accepts it without compiler errors. Who is right?
Note that if the typedef is removed, or changed to typedef ::foo foo_type
, both gcc and clang accept the code.
回答1:
gcc is correct, but clang is not required to give a diagnostic (3.3.7):
A name N used in a class S shall refer to the same declaration in its context and when re-evaluated in the completed scope of S. No diagnostic is required for a violation of this rule.
This is because of how class scope works. The foo
of void foo();
is visible within the entire scope of the class A
, so the declaration of void foo();
changes the meaning of foo
in the typedef from referring to struct foo
to the name of the function foo
.
来源:https://stackoverflow.com/questions/15537023/declaration-of-method-changes-meaning-of-symbol