Các mã sau đây không biên dịch trong Visual Studio 2005:Giải pháp cho một Visual Studio 2005 C++ thừa kế lỗi
class OriginalClass
{
public:
class Delegate
{
virtual void original_func()=0;
};
};
class BaseClass
:public OriginalClass::Delegate // Problem line 1
{
public:
class Delegate
{
virtual void base_func(int x) = 0;
};
void original_func()override{} // Problem line 2
};
class DerivedClass : public BaseClass::Delegate
{
public:
virtual void base_func(int x) override {};
};
int main()
{
DerivedClass derived_object;
derived_object.base_func(10);
}
Việc xây dựng đầu ra là:
1>inherit\main.cpp(26) : error C3668: 'DerivedClass::base_func' : method with override specifier 'override' did not override any base class methods
1>inherit\main.cpp(32) : error C2259: 'DerivedClass' : cannot instantiate abstract class
1> due to following members:
1> 'void OriginalClass::Delegate::original_func(void)' : is abstract
1> inherit\main.cpp(7) : see declaration of 'OriginalClass::Delegate::original_func'
Nếu tôi nhận xét ra các dòng đánh dấu Dòng sự cố 1 và Đường sự cố 2 nó xây dựng OK. Vì vậy, việc sử dụng ghi đè không phải là vấn đề, cũng như không được kế thừa từ lớp lồng nhau. Dường như gặp khó khăn trong việc tìm ra lớp Delegate nào là lớp chính xác để sử dụng.
Sự cố này không tồn tại trong VC2008.
Có ai đề xuất giải pháp cho việc này không? Bên cạnh đó rõ ràng: nâng cấp lên một trình biên dịch hiện đại!
Ngoài ra, tôi sẽ đánh giá cao nếu bất kỳ ai cũng có thể trỏ đến bất kỳ tài liệu nào về lỗi (nếu đó là lỗi).
Edit: @Anonymous Coward đề nghị sử dụng typedefs, nó sẽ biên dịch nếu OriginalClass được thay đổi như sau:
class OriginalClass
{
public:
class Delegate_t
{
virtual void original_func()=0;
};
typedef Delegate_t Delegate;
};
Lý do bạn không thể sử dụng trình biên dịch khác là chính xác? Lỗi chính nó là khá rõ ràng những gì trình biên dịch có một vấn đề với, bạn có bất kỳ bằng chứng khác, đây là một lỗi trình biên dịch, và chỉ đơn giản là không phải là thực tế trình biên dịch là thiếu khả năng này? –
@Ramhound Lý do mà tôi cần phải gắn bó với năm 2005 là tôi cần phải hỗ trợ một thiết bị wince cũ, mà tôi chỉ có một SDK 2005. Tôi không biết nếu nó là một lỗi, nhưng tôi vẫn cần phải nhận được mã này để biên dịch bằng cách nào đó. – Eoghan