Следующий код не компилируется в Visual Studio 2005:
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);
}
Результат сборки:
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'
Если я закомментирую строки, отмеченные Проблемная линия 1 а также Проблемная строка 2 это строит хорошо. Итак, использование переопределение это не проблема и не наследуется от вложенного класса. Кажется, трудно определить, какой класс Delegate является правильным для использования.
Эта проблема не существует в VC2008.
Кто-нибудь может предложить обходной путь для этого? Помимо очевидного: перейти на современный компилятор!
Кроме того, я был бы признателен, если кто-то может указать на любую документацию об ошибке (если это ошибка).
Редактировать:
@Anonymous Coward предложил использовать typedefs, он будет компилироваться, если OriginalClass будет изменен на следующее:
class OriginalClass
{
public:
class Delegate_t
{
virtual void original_func()=0;
};
typedef Delegate_t Delegate;
};
Кажется, это действительно проблема разрешения имен. Компилируется при использовании typedefs:
class OriginalClass {
// class Delegate { ... };
typedef Delegate delegate_t;
};
class BaseClass : public OriginalClass::delegate_t {
// class Delegate { ... };
typedef Delegate delegate_t;
};
class DerivedClass : public BaseClass::delegate_t {
// ...
};
Других решений пока нет …