2010-07-01 107 views
0

我得到确切的错误是:不能dynamic_cast的无效*到模板类

不能dynamic_cast的“对象”(类型为“无效*”)键入“类udDator(INT)*” (源不是指向一个类的指针)

这发生在重写的操作符删除内部。我试图创建一个模板化的内存管理类,可以继承到任何其他类,通过引用管理内存。这将代替聪明的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"); 

回答

2

动态转换需要多态行为,这void没有。改为使用static_cast

4

在C++中,有没有办法来检查指针是否真正包含一个给定的多态类型的对象的地址。

您需要有一个指向其中一个基地的指针。例如,从一个多态接口派生所有相关对象,接受void指针,将其转换为该接口,然后您就可以动态地将其转换为执行运行时检查所需的类型。

+0

这是一些非常好的信息,非常感谢您发布此信息。我会考虑它。不过,我会标记另一个答案,因为从技术上讲,这是我发布的问题的直接解决方案。我希望我可以设置你的解决方案作为答案... – Freezerburn 2010-07-01 05:37:54