Невозможно dynamic_cast void * для шаблонного класса - PullRequest
0 голосов
/ 01 июля 2010

Точная ошибка, которую я получаю:

Невозможно dynamic_cast 'object' (типа 'void *') набрать 'class udDator (int) *' (источник не является указателем на класс)

Это происходит внутри переопределенного оператора delete.Я пытаюсь создать шаблонный класс управления памятью, который может наследовать любой другой класс, управляя памятью по ссылкам.Это было бы вместо чего-то вроде интеллектуального 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" );

Ответы [ 3 ]

4 голосов
/ 01 июля 2010

В C ++ нет способа проверить, действительно ли указатель содержит адрес объекта данного полиморфного типа .

. Вам нужно иметь указатель на одну из баз,Например, извлеките все соответствующие объекты из одного полиморфного интерфейса, возьмите указатель void, приведите его к этому интерфейсу, и оттуда вы сможете динамически привести его к типу, необходимому для проверки во время выполнения.

2 голосов
/ 01 июля 2010

Динамическое приведение требует полиморфного поведения, которого void нет.Вместо этого используйте static_cast.

0 голосов
/ 01 июля 2010

dynamic_cast может использоваться только с указатели и ссылки на объекты. Его целью является обеспечение того, чтобы Результатом преобразования типа является действительный завершенный объект запрошенного класс.

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

...