gpt4 book ai didi

c++ - g++ 提示 "virtual const ... cannot be overloaded"

转载 作者:行者123 更新时间:2023-11-30 01:28:59 25 4
gpt4 key购买 nike

我正在尝试使用第三方 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;
}

(还有几个类似的 block 具有相同的函数名称)

如您所见,它们正在重载虚拟 cosnt 函数。

当我有代码时

CS_EVENTHANDLER_PHASE_LOGIC("application.cstest")

在我的头文件中,我收到此错误:

error: 'virtual const csEventHandlerID* CSTest::GenericSucc(...) const cannot be overloaded'

对于 GenericPrec、InstaceSucc 和 InstancePrec 重复此操作。

我在 Google 上找不到有关此错误的任何信息。似乎没有任何迹象表明虚拟常量不能重载(开发人员似乎也这么认为),那么编译器的问题是什么?

tl;博士:

为什么我不能重载虚 const 函数?

最佳答案

为什么我不能重载虚 const 函数?
当然可以,前提是您重载它们并且不创建具有相同原型(prototype)的两个方法。

syntactically valid 重载虚 const 函数。

所有方法,GenericPrec()InstaceSucc()InstancePrec() 都具有完全相同的原型(prototype)。要重载函数,您必须具有:

参数数量不同
不同类型的参数
不同的参数顺序

您的函数原型(prototype)不满足任何一个标准,因此编译器会提示。

由于它是第三方 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’

您错过了提及您发布的错误消息的第二部分。

关于c++ - g++ 提示 "virtual const ... cannot be overloaded",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6713193/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com