我正在尝试使用第三方SDK(Crystal Space)并遇到一些问题。
代码(不是我的)看起来像这样:
#define CS_EVENTHANDLER_PHASE_LOGIC(x)
CS_EVENTHANDLER_NAMES(x)
CS_EVENTHANDLER_DEFAULT_INSTANCE_CONSTRAINTS
virtual const csHandlerID * GenericPrec
(csRef<iEventHandlerRegistry> &, csRef<iEventNameRegistry> &,
csEventID) const {
return 0;
}
virtual const csHandlerID * GenericSucc
(csRef<iEventHandlerRegistry> &r1, csRef<iEventNameRegistry> &r2,
csEventID event) const {
static csHandlerID succConstraint[6];
if (event != csevFrame(r2))
return 0;
succConstraint[0] = FrameSignpost_Logic3D::StaticID(r1);
succConstraint[1] = FrameSignpost_3D2D::StaticID(r1);
succConstraint[2] = FrameSignpost_2DConsole::StaticID(r1);
succConstraint[3] = FrameSignpost_ConsoleDebug::StaticID(r1);
succConstraint[4] = FrameSignpost_DebugFrame::StaticID(r1);
succConstraint[5] = CS_HANDLERLIST_END;
return succConstraint;
}
#define CS_EVENTHANDLER_PHASE_3D(x)
CS_EVENTHANDLER_NAMES(x)
CS_EVENTHANDLER_DEFAULT_INSTANCE_CONSTRAINTS
virtual const csHandlerID * GenericPrec
(csRef<iEventHandlerRegistry> &r1, csRef<iEventNameRegistry> &r2,
csEventID event) const {
static csHandlerID precConstraint[2];
if (event != csevFrame(r2))
return 0;
precConstraint[0] = FrameSignpost_Logic3D::StaticID(r1);
precConstraint[1] = CS_HANDLERLIST_END;
return precConstraint;
}
virtual const csHandlerID * GenericSucc
(csRef<iEventHandlerRegistry> &r1, csRef<iEventNameRegistry> &r2,
csEventID event) const {
static csHandlerID succConstraint[5];
if (event != csevFrame(r2))
return 0;
succConstraint[0] = FrameSignpost_3D2D::StaticID(r1);
succConstraint[1] = FrameSignpost_2DConsole::StaticID(r1);
succConstraint[2] = FrameSignpost_ConsoleDebug::StaticID(r1);
succConstraint[3] = FrameSignpost_DebugFrame::StaticID(r1);
succConstraint[4] = CS_HANDLERLIST_END;
return succConstraint;
}
(还有几个具有相同功能名称的块)
如您所见,它们正在超载虚拟合作伙伴功能。
当我有代码时
CS_EVENTHANDLER_PHASE_LOGIC("application.cstest")
在我的头文件中,我收到此错误:
error: 'virtual const csEventHandlerID* CSTest::GenericSucc(...) const cannot be overloaded'
对GenericPrec,InstaceSucc和InstancePrec重复此操作。
我无法在Google上找到有关此错误的任何信息。似乎没有任何迹象表明虚拟consts不能重载(开发人员似乎也这么认为)所以编译器的问题是什么?
TL; DR:
为什么我不能重载虚拟const函数?
答案 0 :(得分:4)
为什么我不能重载虚拟const函数?
当然,如果你重载它们而不是用相同的原型创建两个方法,你可以。
重载虚拟const函数 syntactically valid 。
所有方法GenericPrec()
,InstaceSucc()
和InstancePrec()
都有相同的原型。要使函数重载,您必须具有:
不同的参数
不同类型的论点
不同的参数序列
你没有满足任何标准的函数原型,因此编译器抱怨。
由于它是第三方SDK,我认为它必须至少是可编译的,如果是的话,似乎在任何给定的时间点只应启用两个宏中的一个,因此只有一个版本的函数可用。 这些函数不会被写入过载。
此外,您错过了提供确切的错误消息。编译器通常会告诉你它为什么不能重载函数。
检查 this 。
编译器清楚地给出了消息:
prog.cpp:4: error: ‘virtual void MyClass::doSomething(int) const’ cannot be overloaded
prog.cpp:3: error: with ‘virtual void MyClass::doSomething(int) const’
您错过了提及您发布的错误消息的第二部分。
答案 1 :(得分:1)
问题不在virtial
或const
中,而是在同一类中具有完全相同签名的两个GenericSucc
版本中。