2016-09-16 2 views
0

Для следующего кода:dynamic_cast (интермедиат * для Int *) - ошибка компиляции

int i = 8; 

int * p_i = &i; 
int * p_j; 

if (typeid(p_i) != typeid(p_j)) 
{ 
    p_j= dynamic_cast<int *>(p_i); 
} 

Я получаю следующее сообщение об ошибке компиляции:

error: cannot dynamic_cast ‘p_i’ (of type ‘int*’) to type ‘int*’ (target is not pointer or reference to class)

Что мне не хватает?

P.S. Это упрощенный пример поведения, которое я получаю (с функциями шаблона и т. Д.), Поэтому не пытайтесь найти какую-либо цель в этом сегменте кода.

UPD: Поскольку этот код является частью функции шаблона, я не могу знать, получу ли я полный класс или примитив - вот почему.

+6

[ 'dynamic_cast'] (http://en.cppreference.com/w/cpp/language/dynamic_cast) для полиморфизма с классами. Не использовать указатели на собственные типы типа 'int'. Если у вас есть две переменные того же типа, зачем использовать бросок в первую очередь? –

+0

Зачем использовать 'dynamic_cast', если у вас уже есть' if' on 'typeid'? Если вы не хотите, чтобы трансляция проходила иерархию наследования, она не нужна. –

+1

Поскольку у меня есть функция шаблона, которая может иметь как примитивный, так и полиморфный тип –

ответ

2

Поскольку ошибка компилятора указывает, вы не можете использовать dynamic_cast для приведения в действие int*.

Используйте reinterpret_cast для этого.

От C++ 11 Стандарт на:

5.2.7 Dynamic cast [expr.dynamic.cast]

1 The result of the expression dynamic_cast<T>(v) is the result of converting the expression v to type T . T shall be a pointer or reference to a complete class type, or “pointer to cv void.”

Смежные вопросы