繁体   English   中英

C ++歧义问题

[英]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 );

如果我不这样做,它说OnSomeEventListenerBaseClass::OnSomeEventListenerBaseClass::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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM