次のクラステンプレートがあるとします。
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
のInner専門化ごとに個別に定義しますOuter。
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
次にf、すべての特殊化についてメンバー関数を1回定義します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のバグですか、それとも3つのうちの唯一の適合実装ですか?
Inner他のすべての専門分野のためにと定義しf、各専門分野のために個別に解決コンパイルエラー。
Innerそれぞれの専門分野の定義にもかかわらず、不完全な型として報告されているというOuterことでした。Innerその定義を削除すると、明らかに(正しく)不完全なタイプになります。