简体   繁体   中英

Can a member of a class be named the same name as its type (another class)?

Trying to compile the following code on different compilers gives me two different results:

struct S{};
struct T{S S;};
int main(){}

As you can see, inside T , I have an object named the same as the previously defined class S .


On GCC 4.7.2, I get the following error pertaining to the SS; declaration inside T :

error: declaration of 'ST::S' [-fpermissive]
error: changes meaning of 'S' from 'struct S' [-fpermissive]

However, moving it outside of the class (or into main ) works fine :

struct S{};
S S;
int main(){}

What exactly does it mean by the error it's giving me?


In Visual Studio 2012, the whole thing compiles and runs without any errors. Pasting it into this Clang 3.0 compiler gives me no errors as well.

Which is right? Can I actually do this or not?

gcc is correct, from [3.3.7 Class Scope]

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.

However, note that no diagnostic is required , so all compilers are conforming.

The reason is because of how class scope works. When you write SS; S is visible within the entire class and changes the meaning when you use S .

struct S{};
struct T{
    void foo()
    { 
        S myS; // Not possible anymore because S refers to local S
    }
    S S;
};

This code is ill-formed, no diagnostic required. Like the diagnostic says, if a declaration uses a name and the name has a different meaning than it would have when looked up at the end of the class definition, the programm is illformed, no diagnostic required.

@JesseGood provide a complete answer, but if you really want to do this without any error, you can use type's full name and it will work as follow:

struct S {};
struct T { ::S S; };
int main() {return 0;}

No there is no error, since S in your class is T::S and its type is ::S !

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM