Eog*_*han 5 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
{
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);
}
Run Code Online (Sandbox Code Playgroud)
构建输出是:
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'
Run Code Online (Sandbox Code Playgroud)
如果我注释掉标记为问题第1行和问题第2行的行,则构建正常.因此,使用override不是问题,也不是从嵌套类继承.似乎很难确定哪个Delegate类是正确使用的类.
VC2008中不存在此问题.
有人可以为此建议解决方法吗?除了显而易见的:升级到现代编译器!
此外,如果有人能指出任何bug的文档(如果它是一个bug),我将不胜感激.
编辑: @Anonymous Coward建议使用typedef,如果OriginalClass更改为以下内容,它将编译:
class OriginalClass
{
public:
class Delegate_t
{
virtual void original_func()=0;
};
typedef Delegate_t Delegate;
};
Run Code Online (Sandbox Code Playgroud)
这似乎确实是一个名称解析问题。使用 typedef 时可以编译:
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 {
// ...
};
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
450 次 |
| 最近记录: |