[英]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’
您錯過了提及您發布的錯誤消息的第二部分。
問題不在於virtial
或const
,而在於具有完全相同簽名的同一 class 中的兩個版本的GenericSucc
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.