Gegeben die folgende Klassenvorlage:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
Wir definieren Inner
separat für jede Spezialisierung von Outer
:
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
und definieren Sie dann die Elementfunktion f
einmal 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 Inner
für alle anderen Spezialisierungen von Outer
:
template<typename T>
struct Outer<T>::Inner {};
oder indem f
fü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?
Inner
für alle anderen Spezialisierungen als auch das f
separate Definieren für jede Spezialisierung beheben den Kompilierungsfehler.
Inner
trotz Definitionen für jede Spezialisierung der Outer
Bereitstellung als unvollständiger Typ gemeldet wird. Es ist klar, Inner
dass (korrekt) ein unvollständiger Typ ist, wenn Sie seine Definition (en) entfernen.