다음과 같은 클래스 템플릿이 제공됩니다.
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
우리는 정의 Inner
각 전문 분야에 대해 별도로 합니다 Outer
.
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
그런 다음 멤버 함수를 정의하십시오. f
모든 전문화에 대해 한 번Outer
.
auto Outer<T>::f(Inner) -> void
{
}
그러나 Clang (9.0.0)은 다음과 같이 불평합니다.
error: variable has incomplete type 'Outer::Inner'
auto Outer<T>::f(Inner) -> void
^
Inner
다른 모든 전문화에 대한 정의를 제공하여 컴파일러 오류를 피할 수 있습니다.Outer
.
template<typename T>
struct Outer<T>::Inner {};
또는 정의하여 f
각 전문 분야에 대해 별도로 :
template<>
auto Outer<int>::f(Inner) -> void
{
}
template<>
auto Outer<double>::f(Inner) -> void
{
}
GCC와 MSVC는 모두 초기 코드를 받아들이며, 이는 질문을 제기합니다. 이것이 Clang 버그입니까, 아니면 세 가지 중에서 유일한 준수 구현입니까?
Inner
다른 모든 전문화를 들어 및 정의 f
각각의 전문성에 대해 개별적으로 해결 컴파일 오류입니다.
Inner
각 전문 분야에 대한 정의에도 불구하고 불완전한 유형으로보고 되었다는 것 입니다 Outer
. Inner
정의를 제거하면 분명히 불완전한 유형이 될 것입니다.