Tôi đang cố gắng để tạo ra một lớp lồng nhau cũng là một lớp con của mẹ:lớp con lồng nhau trong C++
struct X { struct Y : public X {}; };
Thật không may, điều này dường như không được cho phép trong C++, như g ++ tạo ra lỗi
error: invalid use of incomplete type 'struct X'
Tuy nhiên, mã thực tế của tôi có X
như là một lớp templated:
template<typename T> struct X
{ struct Y : public X {}; };
tôi nhận được thông báo tương tự , nhưng lần này chỉ là cảnh báo:
warning: invalid use of incomplete type 'struct X< T >'
Câu hỏi của tôi là: tại sao trường hợp cũ là bất hợp pháp, trong khi trường hợp templated chỉ đưa ra cảnh báo? Các phiên bản templated hoạt động chính xác như tôi mong đợi nó (Tôi có thể tạo ra các trường hợp của X<T>::Y
, đúc chúng vào X<T>
, và như vậy), nhưng cảnh báo có nghĩa là tôi không nên sử dụng nó? Tôi có thể gặp phải vấn đề gì nếu tôi bỏ qua cảnh báo?
Tôi nghi ngờ bạn cũng sẽ gặp lỗi trong trường hợp thứ hai, khi bạn cố thực sự khởi tạo 'X' –
Sử dụng khai báo chuyển tiếp X? – LiMuBei
@LiMuBei, bạn không thể kế thừa từ lớp chưa hoàn thành (lớp được chuyển tiếp). đó chính là vấn đề. – StoryTeller