由于历史原因,我在我的软件中使用QSharedPointer<T>
。在某些时候,我们希望存储指向相同数据的boost::shared_ptr<T>
,并且应该保留QSharedPointer<T>
的实例。
执行此操作的常用方法是在boost::shared_ptr<T>
的删除器中保留另一个智能指针的副本。但是为了防止删除者针对不同的T
使用不同的类型,这会阻止QSharedPointer
轻松获得boost::get_deleter
,当相应的boost::shared_ptr
被提升时,我想要将原始QSharedPointer<T>
存储为删除者中的QSharedPointer<void>
,而不是使用T
。
但是我发现QSharedPointer
不能胜任这项任务,因为它在编译标题时会抛出“无法完成无效的引用”等错误。
有没有人知道如何在不将T
暴露给删除者的情况下完成这项工作?
答案 0 :(得分:2)
您无法定义QSharedPointer,因为void不是正确的类型。你可以定义QSharedPointer,然后转换为T *和char *,就像这样:
class A {};
QSharedPointer<char> x((char *)new A);
A *ptr = (A *)x.data();
丑陋但它有效。您可能还必须传入一个Deleter,它正确地将类删除到构造函数中,以便正确地破坏您的类。
更好的选择是使用基类。