1

私は2つのクラスAとBを持っています。BはAから派生しています。引数はBのオブジェクトです。私は*またはB *に動的キャストvoid *型にしようとすると不完全なクラス:void *をdynamic_cast経由でクラス型へのポインタに変換します

class B; 
typedef double (*func_ptr)(B *); 

class A 
{ 
    private: 
    func_ptr func; 
}; 

class B: public A 
{ 
    private: 
    double C; 
}; 

、私は次のエラーを取得:

void *v_ptr; 
A *a_ptr = dynamic_cast<A*>(v_ptr); 
B *b_ptr = dynamic_cast<B*>(v_ptr); 

error: the operand of a pointer dynamic_cast must be a pointer to a complete class type 

を私はなぜこれが起こっているか見当もつかない次のように定義されました。いずれのクラスにも仮想メソッドはありません。クラスの前方宣言はメンバーを宣言するために使用することはできませんが、ここではポインタを定義するために使用されています。

誰でもこのエラーが発生している理由を説明できますか?

+2

* "動的キャストしようとすると* *" - それはdynamic_castでは許可されません。あなたの問題はすべてその文章にあります。 – StoryTeller

+0

おそらく転写エラーですが、もしそうでなければ、このセミコロン 'プライベート 'はあなたに何の恩恵も与えていません。 – user4581301

+0

@ user4581301はい、ご迷惑をおかけします。 – Harshad

答えて

2

voidがない間は、dynamic_castで必要とされる式は、完全なクラス型を参照する必要があり、dynamic_castによってvoid*を変換することはできません。

(強調鉱山)BTW

lvalue of a complete class type if new_type is a reference, prvalue of a pointer to complete class type if new_type is a pointer.

:変換タイプがあまりにも完全なクラス型を参照すべきです。

  1. The result of the expression dynamic_­cast<T>(v) is the result of converting the expression v to type T....
  2. If T is a pointer type, v shall be a prvalue of a pointer to complete class type, and the result is a prvalue of type T...

さらに、それは本当に不明だあなたがすべてでdynamic_castを使用している理由:

pointer to complete class type, reference to complete class type, or pointer to (optionally cv-qualified) void

+0

ありがとうございます。今、私は分かる。私はstatic_cast – Harshad

1

dynamic_castのオペランドは完全なクラス型([expr.dynamic.cast])へのポインタでなければなりません。あなたの例のクラスはポリモーフィックではありません。視覚的な仮想機能はありません。

+0

おかげで使用する必要があります。今、私は分かる。私はstatic_castを使うべきです – Harshad

関連する問題