Tôi đã gặp phải một hành vi khá lạ khi sử dụng tự động và dynamic_cast. Đây là lớp hệ thống phân cấp tôi có:động đúc tham chiếu và tự động
class BaseInterface {
public:
virtual void someMethod()=0;
};
class Derived:public BaseInterface {
public:
virtual void someMethod1()=0;
void someMethod()override;
};
Và tất nhiên có một số lớp học mà thực hiện tất cả các phương pháp có nguồn gốc.
Tiếp theo là một lớp thứ ba mà trông như thế này:
class ThirdClass {
public:
void demoMethod(BaseInterface&);
void anotherMethod(Derived&);
};
void ThirdClass::demoMethod(BaseInterface& obj) {
auto buffer=dynamic_cast<Derived&>(obj);
anotherMethod(buffer);
}
Khi tôi biên dịch này với gcc tôi nhận được một "không thể phân bổ một đối tượng kiểu trừu tượng" lỗi. Trong khi đó, khi tôi thay
auto buffer=...
với
Derived& buffer=...
tất cả mọi thứ biên dịch tốt. Tại sao lại như vậy? Là tự động không deducing đúng loại hoặc một cái gì đó?
Ngoài ra tôi tìm thấy một thủ thuật bẩn để vẫn sử dụng auto:
void ThirdClass::demoMethod(Base& obj) {
auto buffer=dynamic_cast<Derived*>(&obj);
anotherMethod(*buffer);
}
Tôi đoán 'tự động 'loại trừ loại' Bộ đệm có nguồn gốc', không phải là 'Nguồn gốc & bộ đệm'. – melpomene
Bạn đang sử dụng phiên bản g ++ nào? Hoạt động tốt để biên dịch mã của bạn [sau khi sửa lỗi chính tả như không có kiểu trả về 'demoMethod' và không thừa kế trên' derived'] - cả hai clang ++ 3.7 (khoảng hai tuần tuổi) và g ++ 4.9.2. –
@MatsPetersson: Nếu kiểu trả về bị thiếu là cố định, nó bị lỗi theo cách được báo cáo với bất kỳ ideone trình biên dịch nào sử dụng: http://ideone.com/UEtfui –