【问题标题】:Incomplete class: Convert void* to pointer to class type via dynamic_cast不完整的类:通过 dynamic_cast 将 void* 转换为指向类类型的指针
【发布时间】:2018-05-25 17:52:43
【问题描述】:

我有2个类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 时"* - dynamic_cast 不允许这样做。你的整个问题都在这句话中。
  • 可能是转录错误,但如果不是这个分号private; 对您没有任何帮助。
  • @user4581301 是的,抱歉,这是私密的:

标签: c++ casting forward-declaration dynamic-cast incomplete-type


【解决方案1】:

您不能将void* 转换为dynamic_castdynamic_cast 所需的表达式必须引用完整的类类型,而void 不是。

(强调我的)

完整类类型的左值如果new_type是一个引用,一个指向完整类类型的指针的右值如果new_type是一个指针。

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

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

【讨论】:

  • 谢谢。我现在知道了。我应该使用 static_cast
【解决方案2】:

dynamic_cast的操作数必须是指向完整类类型([expr.dynamic.cast])的指针:

  1. 表达式dynamic_­cast&lt;T&gt;(v)的结果是将表达式v转换为T类型的结果......
  2. 如果 T 是指针类型,v 应该是指向完整类类型的指针的纯右值,结果是 T 类型的纯右值...

此外,您完全不清楚为什么您使用dynamic_cast。您示例中的类不是多态的。看不到任何虚函数。

【讨论】:

  • 谢谢。我现在知道了。我应该使用 static_cast
猜你喜欢
  • 2012-10-19
  • 2021-09-20
  • 1970-01-01
  • 1970-01-01
  • 2017-10-07
  • 2015-02-14
  • 2021-12-31
  • 2012-08-15
相关资源
最近更新 更多