Diberikan templat kelas berikut:
template<typename T>
struct Outer
{
struct Inner;
auto f(Inner) -> void;
};
kami mendefinisikan Inner
secara terpisah untuk setiap spesialisasi Outer
:
template<>
struct Outer<int>::Inner {};
template<>
struct Outer<double>::Inner {};
dan kemudian mendefinisikan fungsi anggota f
sekali 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 Inner
untuk semua spesialisasi lainnya dari Outer
:
template<typename T>
struct Outer<T>::Inner {};
atau dengan mendefinisikan f
secara 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?
Inner
untuk semua spesialisasi lainnya dan mendefinisikan f
secara terpisah untuk setiap spesialisasi menyelesaikan kesalahan kompilasi.
Inner
adalah yang dilaporkan sebagai tipe yang tidak lengkap meskipun ada definisi untuk setiap spesialisasi Outer
yang disediakan. Jelas Inner
akan (dengan benar) menjadi tipe yang tidak lengkap jika Anda menghapus definisinya.