次のクラステンプレートがあるとします。
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
その定義を削除すると、明らかに(正しく)不完全なタイプになります。