C++ 歧义问题

C++ Ambiguity issue

本文关键字:问题 歧义 C++      更新时间:2023-10-16

让以下类:

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::

如果我不这样做,它说OnSomeEventListener BaseClass::OnSomeEventListenerBaseClass::OnSomeEventListener::OnSomeEventListener是模棱两可

为什么它会认为我引用的是构造函数而不是OnSomeEventListener类型?既然我已经在BaseClass内部,为什么我需要在参数类型前面加上BaseClass::

谢谢。

为什么我需要在参数类型前面加上 BaseClass:: 因为我已经在 BaseClass 中了?

你在BaseClass里面,但你也在OnSomeEventListener里面,因为你从两者继承。

当编译器解析一个名称时,它不会想到"我这里需要一个类型,这可以是一个枚举吗?">,而是认为"我这里有一个名字,它能是什么?"。在您的情况下,它可以是两件不同的事情,具体取决于在哪个基类中搜索名称。

你根本不需要BaseClass::OnSomeEventListener的作用域,因为你在继承BaseClass::OnSomeEventListener时引入了它:

class ChildClass:
  public BaseClass,
  public BaseClass::OnSomeEventListener
{
  virtual void OnSomeEvent(SomeEnum eventData);
};

话虽如此,ChildClass中的OnSomeEventListener是模棱两可的,因为它可以是该范围内的构造函数或类,因为您继承了两者。

当尝试使用名称OnSomeEventListener::SomeEnum时,它前面没有::因此编译器使用非限定的查找规则来创建查找集。从编译器错误中,您可以看到它首先只考虑OnSomeEventListener,这在该范围内直接变得不明确,因为类本身和构造函数都匹配。