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

如果我不这样做,它说OnSomeEventListenerBaseClass::OnSomeEventListenerBaseClass::OnSomeEventListener::OnSomeEventListener

之间有歧义

为什么它认为我引用的是构造函数而不是 OnSomeEventListener 类型?为什么我需要在参数类型前加上 BaseClass:: 因为我已经在 BaseClass 中了?

谢谢。

Why would i need to prefix the argument type with BaseClass:: since I'm already inside BaseClass ?

你在 BaseClass 中,但你在 OnSomeEventListener 中也是 ,因为你继承了两者。

当编译器解析一个名称时,它不会认为 "I need a type here, can this be an enum?",而是认为 "I have a name here, what can it be?".在您的情况下,它可能是两种不同的东西,具体取决于在哪个基础 class 中搜索名称。

您根本不需要 BaseClass::OnSomeEventListener 作用域,因为您在继承 BaseClass::OnSomeEventListener:

时引入了它
class ChildClass:
  public BaseClass,
  public BaseClass::OnSomeEventListener
{
  virtual void OnSomeEvent(SomeEnum eventData);
};

ChildClass 中所说的 OnSomeEventListener 是模棱两可的,因为它可以是构造函数,也可以是该作用域中的 class,因为您继承了两者。

当尝试使用名称 OnSomeEventListener::SomeEnum 时,它没有以 :: 开头,因此编译器使用 unqualified lookup rules 创建一个 查找集 。从编译器错误中,您可以看到它首先只考虑 OnSomeEventListener,这在该范围内直接变得模棱两可,因为 class 本身和构造函数都匹配。