Aşağıdaki sınıf şablonu verildiğinde:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
Inner
her 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 f
tü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
^
Inner
Diğer tüm uzmanlıkların tanımını da yaparak derleyici hatasını atlatabiliriz Outer
:
template<typename T>
struct Outer<T>::Inner {};
veya f
her 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ı?
Inner
tüm diğer uzmanlık için ve tanımlayan f
her uzmanlık için ayrı ayrı kararlılığı derleme hatası.
Inner
her uzmanlık için tanımlara rağmen eksik bir tür olarak raporlanmasıydı Outer
. Inner
Tanım (lar) ını kaldırırsanız açıkça (doğru olarak) eksik bir tür olacaktır.