我得到的确切错误是:
不能使用dynamic_cast'object'(类型'void *')来输入'class udDator(int)*' (source不是指向类的指针)
这发生在重写的运算符delete中。我正在尝试创建一个模板化的内存管理类,它可以继承到任何其他类,通过引用管理内存。这将取代类似智能shared_ptr的东西,试图使内存管理更加不可见,并且无需额外输入(shared_ptr< someClass> shared(new someClass())有点长......)。
无论如何,这是相关的代码。如果我忘记提及任何细节,或者没有您需要查看的代码,请告诉我。
重写的运算符:
template< class T >
class udSharedMemory
{
public:
void operator delete( void *object )
{
T *temp = dynamic_cast< T* >( object ); //<------ ERROR!
assert( temp && "Something went wrong during casting" );
temp->release();
}
}
模板类:
template< class T >
class udDator : public udMemoryManaged, public udSharedMemory< udDator< T > >
{
// stuff
};
模板化类的用法:
udDator< int > *test = new udDator< int >( "5" );
答案 0 :(得分:4)
在C ++中,无法检查指针是否确实包含给定多态类型的对象的地址。
你需要有一个指向其中一个基础的指针。例如,从一个多态接口派生所有相关对象,获取void指针,将其转换为该接口,然后从那里您可以动态地将其转换为执行运行时检查所需的类型。
答案 1 :(得分:2)
动态强制转换需要多态行为,void
没有。请改用static_cast
。
答案 2 :(得分:0)
dynamic_cast
只能用于 指针和对象的引用。 它的目的是确保 类型转换的结果是a 请求的有效完整对象 类。