2011-07-15 6 views
1

サードパーティのSDK(Crystal Space)を使用しようとしていて、問題が発生しています。g ++は「仮想const ...オーバーロードできません」と苦情を言います

コード(ない鉱山)は次のようになります。

#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関数をオーバーロードできないのですか?

+1

コードを投稿する必要があります*投稿*前処理。私たちの誰もそのようなコードを読むことはできません – Puppy

答えて

4

なぜ仮想const関数をオーバーロードできないのですか?
同じプロトタイプの2つのメソッドを作成せず、それらをオーバーロードすることができます。

これは、仮想const関数のオーバーロードにsyntactically validです。

すべての方法、GenericPrec()InstaceSucc()およびInstancePrec()は、全く同じプロトタイプを持っています。あなたはどちらか持っている必要があります機能をオーバーロードするには、次の引数

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

異なるなしに、あなたは、コンパイラが文句を言い、したがって基準のどちらも満足しています。

サードパーティのSDKなので、私は少なくともコンパイル可能でなければならないと思っています。そうすれば、ある時点で2つのマクロのうち1つしか有効にならないように思われます。利用可能です。 これらの関数はオーバーロードされないように書かれていません

また、正確なエラーメッセージを表示しています。コンパイラは通常、関数が関数をオーバーロードできない理由を正確に伝えます。

チェックthisです。

コンパイラ明確にメッセージを表示します。

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番目の部分に言及して逃しています。

+0

はい、それは非常に論理的です。私はどういうわけか、彼らはすべて同じ署名を持つという事実を考えなかった。 それは問題は私が何を伝え、私が使用しています結晶スペースのためのチュートリアルであるようだ:私はこれらのいずれかをコメントアウトした場合 CS_EVENTHANDLER_NAMES(「application.simple1」) CS_EVENTHANDLER_NIL_CONSTRAINTS を、それが動作します。問題は両者が同時に起こっているようです。 – Jeff

+0

私は貧弱なチュートリアルの足元に欠陥を置いて移動します。ご協力いただきありがとうございます。 – Jeff

1

virtialまたはconstではなく、同じクラスの同じ名前のGenericSuccの2つのバージョンでは問題はありません。

関連する問題