【问题标题】:C++ Ambiguity issueC++ 歧义问题
【发布时间】:2015-11-12 13:11:13
【问题描述】:

让以下类:

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 里面了?

谢谢。

【问题讨论】:

    标签: c++ inheritance ambiguous


    【解决方案1】:

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

    你在BaseClass 内部,但你也是OnSomeEventListener 内部,因为你继承自两者。

    当编译器解析一个名字时,它不会认为“我这里需要一个类型,这可以是一个枚举吗?”,而是认为“我这里有一个名字,会是什么?”。在您的情况下,它可以是两种不同的东西,具体取决于搜索名称的基类。

    【讨论】:

    • 感谢您的帮助。
    【解决方案2】:

    您根本不需要BaseClass::OnSomeEventListener 范围,因为您将其与BaseClass::OnSomeEventListener 的继承一起引入:

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

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

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

    【讨论】:

    • 感谢您的回答。但是编译器怎么会考虑我们在参数定义中引用构造函数的可能性呢?
    • 我用更多细节更新了答案。但是查找规则包含很多我不太熟悉的复杂性和陷阱
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-12-05
    • 2022-08-02
    • 1970-01-01
    • 2010-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多