我得到以下编译错误在我的一个类,使用gcc 3.4.5(MinGW的)暧昧:请求成员`...”是在G ++
src/ModelTester/CModelTesterGui.cpp:1308: error: request for member `addListener' is ambiguous
include/utility/ISource.h:26: error: candidates are: void utility::ISource<T>::addListener(utility::IListener<T>*) [with T = const SConsolePacket&]
include/utility/ISource.h:26: error: void utility::ISource<T>::addListener(utility::IListener<T>*) [with T = const SControlPacket&]
希望你可以看到, ISource<T>
是一个模板接口,它只是表明该对象可以是某个匹配类型为IListener<T>
的对象的通道。所以让我厌烦的是这个想法,即由于某些原因,当我可以说,功能不明确时,它们不是。对于不同输入类型IListener<const SConsolePacket&>
和IListener<const SControlPacket&>
,addListener()
方法过载。的用法是:
m_controller->addListener(m_model);
凡m_model
是指向一个IRigidBody
对象,IRigidBody
仅从IListener< const SControlPacket& >
继承和从IListener< const SConsolePacket& >
作为健全性检查绝对不是,我使用的doxygen生成类层次图和doxygen同意我的说法IRigidBody
不是从IListener< const SConsolePacket& >
很明显,我对C++中inheritence的理解并不完全正确。我的印象是IListener<const SControlPacket&>
和IListener<const SConsolePacket&>
是两种不同类型的下方,该函数声明
addListener(IListener<const SConsolePacket&>* listener)
和
addListener(IListener<const SControlPacket&>* listener)
声明两个单独的函数做取决于两个不同的东西(不同)输入的不同类型的参数。此外,我的印象是指向IRigidBody
的指针也是指向IListener<const SControlPacket&>
的指针,通过调用addListener(m_model)
,编译器应该明白我正在调用上述两个函数中的第二个函数。
我甚至尝试铸造m_model
这样的:
m_controller->addListener(
static_cast<IListener<const SControlPacket&>*>(m_model));
,但仍然得到这个错误。我不能在我的生活中看到这些功能是如何模糊的。任何人都可以解释这个问题吗?
P.S.我知道如何做这个给力的功能,是未暧昧:
m_controller->ISource<const SControlPacket&>::addListener(m_model);
我恰好觉得是非常unreadible,我不希望有这样做。
编辑...只是开玩笑。这因为它会导致链接错误显然不能解决问题:
CModelTesterGui.cpp:1312: undefined reference to `utility::ISource<aerobat::SControlPacket const&>::addListener(utility::IListener<SControlPacket const&>*)'
SControlPacket和SConsolePacket之间的关系是什么? – GRB 2009-08-21 16:59:28
请问为什么最后一行'm_controller-> ISource :: addListener(m_model);'消除了这个调用的歧义?如果函数超载,它们应该在同一个类中。这些职能在哪里申报? –
2009-08-21 17:01:49
@GRB没有关系。两者都是从无到有的结果。 @litb我错了。它使它编译,但事实证明,当链接器去尝试找到纯虚拟的ISource <...> :: addListener(...)时,会导致链接错误。现在我很困惑。当你说声明我假设你的意思是定义。它们被定义在来自IController的concerete类中。 – cheshirekow 2009-08-21 17:12:31