2

サードパーティの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;                        
}

(同じ関数名を持つこれらのようなブロックがさらにいくつかあります)

ご覧のとおり、これらは仮想cosnt関数をオーバーロードしています。

私がコードを持っているとき

CS_EVENTHANDLER_PHASE_LOGIC("application.cstest")

ヘッダーファイルで、次のエラーが発生します。

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

これは、GenericPrec、InstaceSucc、およびInstancePrecに対して繰り返されます。

このエラーに関するGoogleの情報を見つけることができませんでした。仮想定数がオーバーロードできないことを示すものは何もないようです(そして開発者はそう考えているようです)ので、コンパイラの問題は何ですか?

tl; dr:

仮想const関数をオーバーロードできないのはなぜですか?

4

2 に答える 2

5

仮想const関数をオーバーロードできないのはなぜですか?
もちろん、それらをオーバーロードし、同じプロトタイプで2つのメソッドを作成しない限り、可能です。

仮想const関数をオーバーロードすることは構文的に有効です。

すべてのメソッド、、、GenericPrec()およびInstaceSucc()まったくInstancePrec()同じプロトタイプがあります。関数をオーバーロードするには、次のいずれかが必要です。

異なる引数の数
異なるタイプの引数
異なるシーケンスの引数

あなたが持っている関数プロトタイプはどちらの基準も満たさないので、コンパイラは文句を言います。

これはサードパーティのSDKであるため、少なくともコンパイル可能である必要があります。その場合、任意の時点で2つのマクロのうち1つだけを有効にする必要があるようです。そのため、使用できる関数のバージョンは1つだけです。これらの関数は、オーバーロードされるようには作成されていません

また、あなたは正確なエラーメッセージを与えることを逃しています。コンパイラは通常、関数をオーバーロードできない理由を正確に教えてくれます。

これを確認してください。

コンパイラは明確にメッセージを出します:

prog.cpp:4: error: ‘virtual void MyClass::doSomething(int) const’ cannot be overloaded
prog.cpp:3: error: with ‘virtual void MyClass::doSomething(int) const’

あなたはあなたが投稿したエラーメッセージの2番目の部分に言及することを逃しました。

于 2011-07-15T21:31:49.520 に答える
1

問題はinvirtialまたはinではなく、まったく同じ署名を持つ同じクラスのconst2つのバージョンにあります。GenericSucc

于 2011-07-15T21:23:06.250 に答える