Diberikan templat kelas berikut:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
kami mendefinisikan Innersecara terpisah untuk setiap spesialisasi Outer:
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
dan kemudian mendefinisikan fungsi anggota fsekali untuk semua spesialisasi Outer:
auto Outer<T>::f(Inner) -> void
{
}
tapi Dentang (9.0.0) mengeluh:
error: variable has incomplete type 'Outer::Inner'
auto Outer<T>::f(Inner) -> void
^
Kami dapat menghindari kesalahan kompilator dengan juga memberikan definisi Inneruntuk semua spesialisasi lainnya dari Outer:
template<typename T>
struct Outer<T>::Inner {};
atau dengan mendefinisikan fsecara terpisah untuk setiap spesialisasi:
template<>
auto Outer<int>::f(Inner) -> void
{
}
template<>
auto Outer<double>::f(Inner) -> void
{
}
Baik GCC dan MSVC menerima kode awal, yang menimbulkan pertanyaan; apakah ini bug Dentang atau hanya implementasi yang sesuai dari ketiganya?
Inneruntuk semua spesialisasi lainnya dan mendefinisikan fsecara terpisah untuk setiap spesialisasi menyelesaikan kesalahan kompilasi.
Inneradalah yang dilaporkan sebagai tipe yang tidak lengkap meskipun ada definisi untuk setiap spesialisasi Outeryang disediakan. Jelas Innerakan (dengan benar) menjadi tipe yang tidak lengkap jika Anda menghapus definisinya.