动态铸造有哪些局限性?

时间:2017-08-25 12:15:14

标签: c++ casting

我需要在我的程序中使用强制转换。我的代码标题,在我的基类

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);}
                                                        ^

在我眼里,它是一个指针。我做违法的事吗?

1 个答案:

答案 0 :(得分:2)

虽然dynamic_cast<T>有多个限制,但是与您的情况相关的限制在C ++标准的5.2.7.1节中描述:

  

表达式dynamic_cast<T>(v)的结果是将表达式v转换为类型T的结果。 T应该是指向完整类类型的指针或引用,或“指向cv void的指针。”

请注意上述说明中类类型完成的要求。

在您的情况下,TSupervisor*,根据错误消息,它不是指向完整类的指针(即指向已向前声明的类的指针,但是未完全指定)。

包含Supervisor的标头文件可以解决此问题。