为什么我不能将模板化对象静态化为继承树
Why can I not static_cast a templated object down an inheritance tree?
简而言之:
Derived
继承自Base
Holder
被模板化为包含指向任何内容的指针-
我可以看出,一个被称为
Holder<Base>
的对象是Holder<Derived>
。如何告诉编译器?
这不会编译:
struct Base { };
struct Derived : Base { };
template <typename T>
struct Holder {
T* point;
int id;
};
Derived* d = new Derived();
Holder<Base> holder {d, 12};
Holder<Derived> specific( static_cast<Holder<Derived>>(holder) );
error: no matching conversion for static_cast from 'Holder<Base>' to 'Holder<Derived>'
这无疑是一次天真的尝试。但为什么这不起作用,我应该如何获得我需要的specific
支架?
因为Holder<Derived>
不是从Holder<Base>
派生的,所以它们是完全不相关的类型,恰好是从同一个类模板生成的。
您可以创建一个包含正确值的Holder<Derived>
:
Holder<Derived> specific{ static_cast<Derived*>(holder.point), holder.id };
或者,您可以通过添加一个执行强制转换的转换构造函数将该功能添加到Holder
类模板本身:
template <typename T>
struct Holder {
Holder(T* pt, int id) : point(pt), id(id) { }
template<typename U>
Holder(const Holder<U>& h)
: point(static_cast<T*>(h.point)), id(h.id)
{ }
T* point;
int id;
};
现在,您最初尝试使用static_cast
将起作用,因为它们之间存在有效的转换,或者您可以将其写成:
Holder<Derived> specific( holder );
只要static_cast<Derived*>(holder.point)
编译,该语句就会编译。
相关文章:
- 停止cmake target_link_libraries将插件中静态库的两个对象文件链接到静态库本身
- 类的全局对象和静态成员
- CPU 瓶颈;处理具有许多非静态对象的 3D 场景渲染的简单方法
- 将 RTOS 队列对象封装在仅具有静态分配的 IQueue 自定义接口中
- 我可以读取静态对象中的文件.txt吗?C++
- 为什么静态数组成员变量在调用对象的实例后不显示任何内容?
- 链接时,不同静态库中的同一对象文件
- 通过 Gazebo 世界插件将静态对象附加到机器人链接
- 将对象创建为全局/静态对象会崩溃,而本地对象不会崩溃
- 静态分配对象的值初始化
- 内联函数的函数本地静态对象是否在共享对象文件之间共享?
- 将基类分配给派生对象,反之亦然,以C++以及静态和动态对象之间的差异
- 如何正确实例化静态字段 tat 是另一个类对象
- 非静态成员引用必须相对于特定对象
- 如何将对象添加到类中的静态向量
- SFML-对象静态定义
- 派生类没有额外的数据成员;将基对象静态向下转换为派生对象是否安全
- 使用全局对象静态成员时出现seg错误
- 卸载应用程序域不清除C++ COM 对象静态成员
- 为什么我不能将模板化对象静态化为继承树