Gegeben die folgende Klassenvorlage:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
Wir definieren Innerseparat für jede Spezialisierung von Outer:
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
und definieren Sie dann die Elementfunktion feinmal für alle Spezialisierungen von Outer:
auto Outer<T>::f(Inner) -> void
{
}
aber Clang (9.0.0) beschwert sich:
error: variable has incomplete type 'Outer::Inner'
auto Outer<T>::f(Inner) -> void
^
Wir können dem Compilerfehler ausweichen, indem wir auch eine Definition Innerfür alle anderen Spezialisierungen von Outer:
template<typename T>
struct Outer<T>::Inner {};
oder indem ffür jede Spezialisierung separat definiert wird :
template<>
auto Outer<int>::f(Inner) -> void
{
}
template<>
auto Outer<double>::f(Inner) -> void
{
}
Sowohl GCC als auch MSVC akzeptieren den ursprünglichen Code, der die Frage aufwirft. Ist dies ein Clang-Fehler oder ist es die einzige konforme Implementierung von den drei?
Innerfür alle anderen Spezialisierungen als auch das fseparate Definieren für jede Spezialisierung beheben den Kompilierungsfehler.
Innertrotz Definitionen für jede Spezialisierung der OuterBereitstellung als unvollständiger Typ gemeldet wird. Es ist klar, Innerdass (korrekt) ein unvollständiger Typ ist, wenn Sie seine Definition (en) entfernen.