不能dynamic_cast void *到模板化的类

时间:2010-07-01 05:26:56

标签: c++ templates dynamic-cast

我得到的确切错误是:

不能使用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" );

3 个答案:

答案 0 :(得分:4)

在C ++中,无法检查指针是否确实包含给定多态类型的对象的地址。

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

答案 1 :(得分:2)

动态强制转换需要多态行为,void没有。请改用static_cast

答案 2 :(得分:0)

  

dynamic_cast只能用于   指针和对象的引用。   它的目的是确保   类型转换的结果是a   请求的有效完整对象   类。

http://www.cplusplus.com/doc/tutorial/typecasting/