class A {
virtual A* foo() = 0;
};
template<class T>
class B : public A {
virtual T* foo() { return nullptr; }
};
class C : public B<C> {
};
Đây là cách triển khai đơn giản cho Possibility to mix composite pattern and curiously recurring template pattern. Tôi nhận được lỗi sau:Lỗi biên dịch CRTP và đa hình động
Return type of virtual function 'foo' is not covariant with the return type of the function it overrides ('C *' is not derived from 'A *')
Thử nghiệm trên kêu vang 3.0, gcc 4.7 và visual studio 2008.
giải pháp đầu tiên:
class C : public A, public B<C> {}
biên dịch dưới visual studio với một cảnh báo rằng B đã con của A và không không phải biên dịch dưới tiếng kêu có lỗi ban đầu.
Một workaround:
class D : public A {}
class C : public B<D> {}
giải quyết vấn đề bất toàn, nhưng tôi không thể tìm ra bao nhiêu trường hợp A Tôi sẽ có. Trực giác nói với tôi rằng A là ảo, do đó sẽ chỉ có một.
Giải pháp thay thế này cũng tạo mã không đọc được.
Trạng thái chuẩn nói về tình huống này là gì? Mã này có nên biên dịch không? Nếu không, tại sao?
Luôn ghi nhớ rằng 'C' không đầy đủ trong danh sách các căn cứ. –