【问题标题】:Cannot dynamic_cast void* to templated class不能 dynamic_cast void* 到模板类
【发布时间】:2011-03-10 11:25:21
【问题描述】:

我得到的确切错误是:

不能将'object'('void*'类型)动态转换为'class udDator(int)*' (source 不是指向类的指针)

这发生在被覆盖的操作符删除内部。我正在尝试创建一个模板化的内存管理类,它可以继承到任何其他类中,通过引用管理内存。这将代替智能 shared_ptr 之类的东西,以试图使内存管理更加不可见,并且无需额外输入( shared_ptr 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" );

【问题讨论】:

    标签: c++ templates dynamic-cast


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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

        【讨论】:

        • 这是一些非常好的信息,感谢您发布此信息。我会考虑的。但是,我将标记另一个答案,因为它在技术上是我发布的问题的直接解决方案。我希望我也可以将您的解决方案设置为答案...
        猜你喜欢
        • 2014-05-29
        • 2011-10-09
        • 2011-05-07
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-31
        相关资源
        最近更新 更多