異なるコンパイラで次のコードをコンパイルしようとすると、2つの異なる結果が得られます。
struct S{};
struct T{S S;};
int main(){}
ご覧のとおり、内部T
には、以前に定義したクラスと同じ名前のオブジェクトがありますS
。
GCC 4.7.2では、内部の宣言に関連して次のエラーが発生します。S S;
T
エラー:「ST :: S」の宣言[-fpermissive]
エラー:「S」の意味を「structS」から変更します[-fpermissive]
ただし、クラス外(またはクラス内main
)に移動すると正常に機能します。
struct S{};
S S;
int main(){}
それが私に与えるエラーとは正確にはどういう意味ですか?
Visual Studio 2012では、すべてがエラーなしでコンパイルおよび実行されます。このClang3.0コンパイラに貼り付けると、エラーも発生しません。
どちらが正しいですか?私は実際にこれを行うことができますか?