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::
?
如果我不这样做,它说OnSomeEventListener
在BaseClass::OnSomeEventListener
和BaseClass::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 本身和构造函数都匹配。
让下面的 类 :
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::OnSomeEventListener
和BaseClass::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 本身和构造函数都匹配。