[英]C++ Ambiguity issue
让以下类:
class BaseClass
{
class OnSomeEventListener
{
public:
enum SomeEnum { BLABLA }
virtual void OnSomeEvent( SomeEnum eventData ) = 0;
}
};
class ChildClass :
public BaseClass,
public BaseClass::OnSomeEventListener
{
virtual void OnSomeEvent( BaseClass::OnSomeEventListener::SomeEnum eventData );
}
我的问题是:为什么我需要在方法virtual void OnSomeEvent( BaseClass::OnSomeEventListener::SomeEnum eventData );
的OnSomeEventListener::SomeEnum eventData
前面指定BaseClass::
virtual void OnSomeEvent( BaseClass::OnSomeEventListener::SomeEnum eventData );
?
如果我不这样做,它说OnSomeEventListener
在BaseClass::OnSomeEventListener
和BaseClass::OnSomeEventListener::OnSomeEventListener
之间是模棱两可的
为什么会认为我在引用构造函数而不是OnSomeEventListener
类型? 为什么我需要在参数类型前面加上BaseClass::
前缀,因为我已经在BaseClass
?
谢谢。
为什么我需要在参数类型前面加上BaseClass ::前缀,因为我已经在BaseClass中了?
您在BaseClass
,但也在 OnSomeEventListener
因为您从这两者继承。
当编译器解析名称时,它不会认为“我需要一个类型,这可以是枚举吗?” ,而是认为“我在这里有个名字,这叫什么?” 。 在您的情况下,可能有两件事,这取决于在哪个基类中搜索名称。
您根本不需要BaseClass::OnSomeEventListener
范围,因为您继承了BaseClass::OnSomeEventListener
继承BaseClass::OnSomeEventListener
:
class ChildClass:
public BaseClass,
public BaseClass::OnSomeEventListener
{
virtual void OnSomeEvent(SomeEnum eventData);
};
话虽这么说, ChildClass
OnSomeEventListener
还是模棱两可的,因为它既可以是该范围的构造函数,也可以是该范围的类,因为您都继承了这两者。
当尝试使用名称OnSomeEventListener::SomeEnum
,它不是前面有::
所以编译器使用不合格的查找规则以创建查找集 。 从编译器错误中您可以看到,它首先仅考虑OnSomeEventListener
,因为类本身和构造函数都匹配,所以OnSomeEventListener
在该范围内直接变得模棱两可。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.