G++抱怨"virtual const ... cannot be overloaded"
g++ complains that "virtual const ... cannot be overloaded"
我正在尝试使用第三方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重复此操作。
我没能在谷歌上找到关于这个错误的任何信息。似乎没有任何迹象表明虚拟const不能被重载(开发人员似乎也这么认为),那么编译器的问题是什么呢?
tl;博士:
为什么不能重载虚const函数?
为什么不能重载虚const函数?
当然可以,只要你重载它们并且不创建两个具有相同原型的方法。
重载虚const函数在语法上是合法的。
所有的方法,GenericPrec()
, InstaceSucc()
和InstancePrec()
具有相同的原型。要重载一个函数,必须有以下两种:
参数个数不同
不同类型的参数
不同的参数序列
你的函数原型不满足这两个条件,因此编译器会报错。
因为它是一个第三方SDK,我认为它必须至少是可编译的,如果是这样的话,似乎只有两个宏中的一个应该在任何给定的时间点启用,所以只有一个版本的功能是可用的。这些函数不是为重载而编写的。
还有,你错过了给出准确的错误信息。编译器通常会准确地告诉你为什么它不能重载一个函数。
这个<<p>检查/strong>。编译器给出了明确的信息:
prog.cpp:4: error: ‘virtual void MyClass::doSomething(int) const’ cannot be overloaded
prog.cpp:3: error: with ‘virtual void MyClass::doSomething(int) const’
你漏掉了你发布的错误信息的第二部分
问题不在virtial
或const
中,而是在同一类中具有完全相同签名的GenericSucc
的两个版本中。
相关文章:
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 使用模板进行堆栈实现; "name followed by :: must be a class or namespace"
- 这对"With a stackless coroutine, only the top-level routine may be suspended."意味着什么
- 为什么我会" void value not ignored as it ought to be"?
- 模板规范获取'Ambiguous call to overloaded function'
- 如何解决"no Qt platform plugin could be initialized"问题?
- C++/SDL "initial value of reference to a non-const must be an lvalue"
- 如何修复输出日志中的"EnableInput can only be specified on a Pawn for its Controller"错误
- _BitScanForward64 can not be found
- C++复制函数重载导致"must be a nonstatic member function"错误
- 通过分隔符分隔包含 UTF-16 BE 文本的uint8_t数组
- C++ "error: use of overloaded operator '*' is ambiguous"似乎只有一场比赛
- C++ 错误:"array must be initialized with a brace-enclosed initializer"
- 如何修复C++中的" No viable overloaded '=' "
- "expression must be a modifiable lvalue"是什么意思?
- 尝试查找两组点的交集,错误"No viable overloaded '=' "
- 如何摆脱导入的 make 项目中的 Eclipse 索引器"Type std::... could not be resolved"错误
- C++ 与函数联合,Arduino编译器错误"cannot be overloaded"
- 犰狳/ Xcode:无处"functions that differ only in their return type cannot be overloaded"错误
- G++抱怨"virtual const ... cannot be overloaded"