내가 구조체는 메타 프로그래밍 목적으로 다른 유형에 대한 유형 별칭을 포함시킬 :같은 이름을 사용하여 주변 범위의 유형에 멤버 유형 별칭을 선언해도됩니까?
struct Foo {};
struct WithNestedTypeAlias {
using Foo = Foo;
};
는 그럼 난 템플릿에서 WithNestedTypeAlias::Foo
같은 물건을 할 수있는 등
, 이러한 유형의 별칭은 유효 Foo
유형의 의미가 변경되지 않기 때문입니다. Clang은 이것을 행복하게 컴파일합니다.
그러나, GCC는 불평 : 나는 명시 적으로 struct Foo
에서 Foo
의 의미를 변경하지 않는거야 때문에
test-shadow-alias.cpp:4:20: error: declaration of ‘using Foo = struct Foo’ [-fpermissive]
using Foo = Foo;
^
test-shadow-alias.cpp:1:8: error: changes meaning of ‘Foo’ from ‘struct Foo’ [-fpermissive]
struct Foo {};
^
이 지금은 혼란 스러워요.
C++ 14의 올바른 동작은 무엇입니까? struct Foo
의 이름을 바꾸면이 문제를 해결할 수 있지만 GCC의 오류가 올바른지 이해하고 싶습니다.
노트 :
3.8과 GCC 5.4,하지만 Godbolt suggests this hasn't changed in more recent GCC versions ++ 그 소리와 함께 테스트.
변수의 이름이 외부 범위의 변수 또는 클래스 멤버를 참조 할 수있는 Interaction between decltype and class member name shadowing an external name을 보았습니다. 대조적으로, 여기에 내 질문은 형식 별칭에 대한 것입니다.
Foo
은 항상 클래스 범위 내에서::Foo
을 참조하므로 모호성이 없습니다. 나는 그 문제가 내 문제에 어떻게 적용되는지를 보지 못했다.이것은 실제로 별칭이 실제로 어떤 유형인지에 대한 오해가 원인 일 수 있습니다. 룰 GCC가 수행된다
문을'Foo = :: Foo;를 사용하여 변경하면 수정되지만 그 이유는 설명 할 수 없습니다. –
'using Foo = struct Foo;로 변경하면 수정됩니다. 이에 해당하는'typedef struct Foo Foo;'는 관용적 인 C 코드입니다. – Oktalist