Étant donné le modèle de classe suivant:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
nous définissons Innerséparément pour chaque spécialisation Outer:
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
puis définissez la fonction membre fune fois pour toutes les spécialisations de Outer:
auto Outer<T>::f(Inner) -> void
{
}
mais Clang (9.0.0) se plaint:
error: variable has incomplete type 'Outer::Inner'
auto Outer<T>::f(Inner) -> void
^
Nous pouvons éviter l'erreur de compilation en fournissant également une définition de Innertoutes les autres spécialisations de Outer:
template<typename T>
struct Outer<T>::Inner {};
ou en définissant fséparément pour chaque spécialisation:
template<>
auto Outer<int>::f(Inner) -> void
{
}
template<>
auto Outer<double>::f(Inner) -> void
{
}
GCC et MSVC acceptent le code initial, ce qui pose la question; est-ce un bug Clang ou est-ce la seule implémentation conforme des trois?
Innerpour toutes les autres spécialisations et la définition fséparée pour chaque spécialisation résolvent l'erreur de compilation.
Innerest incomplet malgré les définitions de chaque spécialisation Outer. Clairement, ce Innersera (correctement) un type incomplet si vous supprimez sa ou ses définitions.