Cercando di compilare il seguente codice su diversi compilatori mi dà due risultati diversi:Un membro di una classe può avere lo stesso nome del suo tipo (un'altra classe)?
struct S{};
struct T{S S;};
int main(){}
Come si può vedere, all'interno T
, ho un oggetto chiamato lo stesso della classe precedentemente definita S
.
In GCC 4.7.2, I get the following error appartenente alla dichiarazione S S;
all'interno T
:
error: declaration of 'S T::S' [-fpermissive]
error: changes meaning of 'S' from 'struct S' [-fpermissive]
Tuttavia, spostandolo fuori della classe (o in main
) works fine:
struct S{};
S S;
int main(){}
Che cosa significa esattamente per l'errore che mi sta dando?
In Visual Studio 2012, l'intero processo viene compilato e eseguito senza errori. Incollarlo in this Clang 3.0 compiler non mi dà errori pure.
Quale è giusto? Posso davvero farlo o no?
Ah, capisco - ho letto male la diagnostica. – ildjarn
@ildjarn, è una bandiera piuttosto strana. Sembra funzionare al contrario. Normalmente, la bandiera responsabile di un avvertimento appare tra parentesi quadre. – chris
Proprio no. Qual e il punto? Confuso? Nota che dopo aver fatto ciò, non puoi più fare riferimento al tipo 'S' nelle funzioni membro senza qualificare esplicitamente il namespace ... –