Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/128.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 不完整类:通过动态_转换将void*转换为指向类类型的指针_C++_Casting_Forward Declaration_Dynamic Cast_Incomplete Type - Fatal编程技术网

C++ 不完整类:通过动态_转换将void*转换为指向类类型的指针

C++ 不完整类:通过动态_转换将void*转换为指向类类型的指针,c++,casting,forward-declaration,dynamic-cast,incomplete-type,C++,Casting,Forward Declaration,Dynamic Cast,Incomplete Type,我有两个类A和B。B是从A派生的。A有一个函数指针成员,其参数是B的对象。这些类的定义如下: class B; typedef double (*func_ptr)(B *); class A { private: func_ptr func; }; class B: public A { private: double C; }; 当我尝试将void*动态强制转换为a*或B*时,会出现以下错误: void *v_ptr; A *a_ptr = dynamic_ca

我有两个类A和B。B是从A派生的。A有一个函数指针成员,其参数是B的对象。这些类的定义如下:

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

class A
{
  private:
    func_ptr func;
};

class B: public A
{
  private:
    double C;
};
当我尝试将void*动态强制转换为a*或B*时,会出现以下错误:

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
void*v_ptr;
A*A_ptr=动态演播(v_ptr);
B*B_ptr=动态_cast(v_ptr);
错误:指针动态转换的操作数必须是指向完整类类型的指针
我不知道为什么会这样。这两个类中都没有虚拟方法。我知道类的前向声明不能用于声明成员,但在这里它被用来定义指针


有人能解释我为什么会出现这个错误吗?

您不能通过转换
void*
,动态转换所需的表达式必须引用完整的类类型,而
void
则不能

(强调矿山)

完整类类型的左值如果
新类型
是引用,则指向完整类类型的指针的PR值如果
新类型
是指针

顺便说一句:转换类型也应该引用完整的类类型

指向完整类类型的指针、指向完整类类型的引用或指向(可选cv限定)void的指针


dynamic\u cast
的操作数必须是指向完整类类型()的指针:

  • 表达式
    动态(v)
    的结果是将表达式v转换为类型T的结果
  • 如果T是指针类型,则v应为指向完整类类型的指针的PR值,结果为T类型的PR值

  • 此外,还不清楚为什么要使用
    dynamic\u cast
    。示例中的类不是多态的。没有虚拟函数可见。

    “当我尝试动态强制转换一个void时”*-这是动态强制转换不允许的。你的全部问题都在那句话里。可能是抄写错误,但如果不是这个分号的话,
    private没有帮你任何忙。@user4581301是的,对不起,这是私人的:谢谢。我现在明白了。我应该用静电感应,谢谢。我现在明白了。我应该使用静态投影