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::
?
谢谢。
为什么我需要在参数类型前面加上 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
,这在该范围内直接变得不明确,因为类本身和构造函数都匹配。
- 警告处理为错误这里有什么问题
- 最小硬币更换问题(自上而下方法)
- 为"adjacent"变量赋值时出现问题
- 我的神经网络不起作用 [XOR 问题]
- 在Ubuntu 16.04上安装Cilk时出现问题
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 编译包含字符串的代码时遇到问题
- Project Euler问题4的错误解决方案
- 问题:什么是QAbstractItemView::NoEditTriggers的反面
- 在编译C++代码(具有dlib和opencv)到WASM时面临问题
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- C++17 中的歧义错误(模板模板参数和默认参数问题)
- 解决 CRTP 函数重载歧义问题
- 如何解决钻石问题的这种歧义
- 概念没有按预期解决歧义。代码示例有什么问题?
- 重载模板化函数歧义问题
- 推导函数调用时出现歧义问题
- C++ 歧义问题
- c++歧义重载问题
- 关于歧义排列的代码问题