簡體   English   中英

g++ 抱怨“虛擬常量……不能重載”

[英]g++ complains that “virtual const … cannot be overloaded”

我正在嘗試使用第三方 SDK(水晶空間)並且遇到了一些問題。

代碼(不是我的)如下所示:

#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;                        
}

(還有幾個類似的塊具有相同的 function 名稱)

如您所見,它們正在重載虛擬成本函數。

當我有代碼時

CS_EVENTHANDLER_PHASE_LOGIC("application.cstest")

在我的 header 文件中,我收到此錯誤:

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

這對 GenericPrec、InstaceSucc 和 InstancePrec 重復。

我無法在 Google 上找到有關此錯誤的任何信息。 似乎沒有任何跡象表明虛擬常量不能被重載(開發人員似乎也是這么認為的)那么編譯器的問題是什么?

tl;博士:

為什么我不能重載虛擬 const 函數?

為什么我不能重載虛擬 const 函數?
當然可以,只要你重載它們並且不使用相同的原型創建兩個方法。

重載虛擬 const 函數在語法上是有效的。

你所有的方法, GenericPrec()InstaceSucc()InstancePrec()都有相同的原型。 要使 function 過載,您必須具有:

arguments的不同編號
不同型號的arguments
arguments的不同序列

您不滿足任何標准的 function 原型因此編譯器抱怨。

由於它是第三方 SDK 我認為它必須至少是可編譯的,如果是這樣,似乎在任何給定時間點都應該啟用兩個宏中的一個,因此只有一個版本的功能可用。 這些函數不是為了重載而編寫的

此外,您錯過了提供確切的錯誤消息。 編譯器通常會准確地告訴你為什么它不能重載 function。

檢查這個

編譯器清楚地給出了信息:

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 ,而在於具有完全相同簽名的同一 class 中的兩個版本的GenericSucc

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM