0

我得到的确切错误是:

不能将'object'('void *'类型)动态转换为'class 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" );
4

3 回答 3

4

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

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

于 2010-07-01T05:31:52.907 回答
2

动态转换需要多态行为,而后者void没有。改用 a static_cast

于 2010-07-01T05:28:56.937 回答
0

dynamic_cast只能与指针和对象引用一起使用。其目的是确保类型转换的结果是所请求类的有效完整对象。

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

于 2010-07-01T05:31:05.777 回答