G++抱怨"virtual const ... cannot be overloaded"

g++ complains that "virtual const ... cannot be overloaded"

本文关键字:be overloaded cannot virtual 抱怨 G++ const      更新时间:2023-10-16

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

你漏掉了你发布的错误信息的第二部分

问题不在virtialconst中,而是在同一类中具有完全相同签名的GenericSucc的两个版本中。