Обходной путь для ошибки наследования Visual Studio 2005 C++

Следующий код не компилируется в 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;
};

1 ответ

Решение

Кажется, это действительно проблема разрешения имен. Компилируется при использовании 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 {
    // ...
};
Другие вопросы по тегам