Aşağıdaki sınıf şablonu verildiğinde:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
Innerher uzmanlık alanı için ayrı ayrı tanımlarız Outer:
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
ve ardından aşağıdaki ftüm uzmanlıklar için üye işlevini bir kez tanımlayın Outer:
auto Outer<T>::f(Inner) -> void
{
}
ancak Clang (9.0.0) şikayet ediyor:
error: variable has incomplete type 'Outer::Inner'
auto Outer<T>::f(Inner) -> void
^
InnerDiğer tüm uzmanlıkların tanımını da yaparak derleyici hatasını atlatabiliriz Outer:
template<typename T>
struct Outer<T>::Inner {};
veya fher uzmanlık için ayrı ayrı tanımlayarak :
template<>
auto Outer<int>::f(Inner) -> void
{
}
template<>
auto Outer<double>::f(Inner) -> void
{
}
Hem GCC hem de MSVC, soruyu soran ilk kodu kabul eder; Bu bir Clang hatası mı yoksa üçü arasında tek uygun uygulama mı?
Innertüm diğer uzmanlık için ve tanımlayan fher uzmanlık için ayrı ayrı kararlılığı derleme hatası.
Innerher uzmanlık için tanımlara rağmen eksik bir tür olarak raporlanmasıydı Outer. InnerTanım (lar) ını kaldırırsanız açıkça (doğru olarak) eksik bir tür olacaktır.