C++ VisualStudio2005c++;遗传缺陷

C++ VisualStudio2005c++;遗传缺陷,c++,inheritance,nested-class,visual-c++-2005,C++,Inheritance,Nested Class,Visual C++ 2005,以下代码未在Visual Studio 2005中编译: class OriginalClass { public: class Delegate { virtual void original_func()=0; }; }; class BaseClass :public OriginalClass::Delegate // Problem line 1 { public: class Delegate { v

以下代码未在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的行,则生成OK。因此,使用覆盖不是问题,也不是从嵌套类继承。它似乎很难确定哪个委托类是正确使用的

VC2008中不存在此问题

有人能建议一个解决方法吗?除了显而易见的:升级到现代编译器

另外,如果有人能指出该bug的任何文档(如果是bug的话),我将不胜感激

编辑: @Anonymous Coward建议使用typedefs,如果原始类更改为以下内容,它将编译:

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 {
    // ...
};

您不能使用其他编译器的原因是什么?这个错误本身很清楚编译器有什么问题,你有任何其他证据,这是一个编译器错误,而不是编译器缺少这个功能的事实?@Ramhound我需要坚持使用2005的原因是我需要支持一个旧的wince设备,我只有一个2005 SDK。我不知道这是否是一个bug,但我仍然需要以某种方式编译这段代码。太棒了,谢谢。您只需更改OriginalClass::Delegate和typedef的名称即可使其正常工作。