2010-07-01 42 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