2017-08-25 2 views
1

自分のプログラムでキャスティングを使用する必要があります。私は、基本クラスダイナミックキャスティングの限界は何ですか?

scSupervisor* msSupervisor; ///< My Supervisor 

で、私のコードの見出しを持っていると私は、派生クラスで、同じヘッダにアクセサ関数を作成したい

Supervisor* Supervisor_Get(void){ return (Supervisor*)msSupervisor;} 
             //dynamic_cast<Supervisor*>(msSupervisor);} 

示すように、静的鋳造コンパイルとうまく動作します。私は、私はエラーメッセージを提示しています(コメントに示す)動的キャスト版に変更する場合は、:私の目には

cannot dynamic_cast '((Core*)this)->Core::<anonymous>.scCore::msSupervisor' (of type 'class scSupervisor*') to type 'class Supervisor*' (target is not pointer or reference to complete type) 
        dynamic_cast<Supervisor*>(msSupervisor);} 
                 ^

、それがポインタです。私は何か違法な行為をしていますか? dynamic_cast<T>ものの

+8

この時点で、コードは「スーパーバイザー」の完全な宣言を参照していますか?私の強調しているエラーメッセージを見てみましょう:_ "ターゲットはポインタではありません。 – user0042

+0

この回答を見るhttps://stackoverflow.com/questions/332030/when-should-static-cast-dynamic-cast-const-cast-and-reinterpret-cast-be-used – Clonk

答えて

2

は、自分の状況に関連するものがC++標準のセクション5.2.7.1に記載されており、複数の制限があります。

表現dynamic_cast<T>(v)の結果は、表現を変換した結果であるvT」と入力します。 Tは完全なクラス型へのポインタまたは参照である、または「CV voidへのポインタ。」しなければならない

注クラスタイプの要件は、上記の説明で完全をすることができます。

TSupervisor*です。エラーメッセージによれば、これは完全なクラスへのポインタではありません(フォワード宣言されたクラスへのポインタですが、完全には指定されていません)。

Supervisorのヘッダーファイルを含めると、この問題が解決されます。

+0

私は#include "scSupervisor .h "私の頭の中に。しかし、その後、私は "class scSupervisor; class Supervisor"も持っていました。多分これはコンパイラを混乱させるでしょうか?とにかく、私は関数の本体を.cppファイルに移動し、すべて正常に動作します。 – katang

+0

@katangこのエラーがヘッダー内のコードで発生した場合、ヘッダーガードが定義を見えなくする可能性が最も高いです。両方のヘッダーの定義が利用可能であるため、コードをcppファイルに移動するとこの問題が解決されることがあります。 – dasblinkenlight

関連する問題