Próbując skompilować następujący kod na różnych kompilatorów daje mi dwa różne wyniki:Czy członek klasy może mieć taką samą nazwę jak jej typ (inna klasa)?
struct S{};
struct T{S S;};
int main(){}
Jak widać, wewnątrz T
, mam obiekt nazwany tak samo jak wcześniej zdefiniowanej klasy S
.
Na GCC 4.7.2, I get the following error dotyczące deklaracji S S;
wewnątrz T
:
error: declaration of 'S T::S' [-fpermissive]
error: changes meaning of 'S' from 'struct S' [-fpermissive]
Jednakże, przesuwając go na zewnątrz klasy (lub do main
) works fine:
struct S{};
S S;
int main(){}
Co dokładnie oznacza błąd, który mi daje?
W Visual Studio 2012 całość się kompiluje i działa bez żadnych błędów. Wklejenie go do this Clang 3.0 compiler również nie powoduje żadnych błędów.
Co jest właściwe? Czy mogę to zrobić, czy nie?
Ach, rozumiem - źle odczytałem diagnostykę. – ildjarn
@ildjarn, To raczej dziwna flaga. Wydaje się działać odwrotnie. Zwykle flaga odpowiedzialna za ostrzeżenie pojawia się w nawiasach kwadratowych. – chris
Po prostu nie rób tego. Jaki jest sens? Dezorientować? Zauważ, że po wykonaniu tej czynności nie możesz już odwoływać się do typu 'S' w funkcjach składowych bez jawnego zakwalifikowania przestrzeni nazw ... –