2010-04-16 2 views
2

У меня есть родительский класс, который является шаблоном, и дочерний класс, который его реализует.C2664 при бросании дочернего класса в шаблонный родительский класс

template< typename T1, typename T2>
class ParentClass{ . . . };

class ChildClass : public ParentClass<MyT1, MyT2> { . . . };

И я хочу, чтобы иметь указатель, который я могу использовать полиморфно:

ParentClass<T1, T2>* ptr;
ptr = static_cast<ParentClass<MyT1, MyT2>* >(new ChildClass());

Независимо от того, как я бросил его, я всегда получаю C2664, который имеет то же выражение:

ошибка C2664: невозможно преобразовать параметр 1 от «ParentClass < T1, T2> *» до «ParentClass < T1, T2> *»

Разве нельзя бросать типов указателей между унаследованными типами, если родитель шаблонный, даже если типы, указанные в шаблонах тоже самое?

+0

Является ли 'MyT1' отличным от' T1'? «Static_cast», как написано, является непоследовательным. – Potatoswatter

+0

Какой компилятор вы используете? VC++? – outis

+0

Почему у вас есть первые 'T1' и' MyT1'? Должен ли первый быть 'MyT1' вместо этого? –

ответ

1

Нет необходимости в статическом литье. Рассмотрим этот код, который работает, как ожидалось:

template <typename T> 
struct base 
{ virtual ~base(){} }; 

struct child : base<int> 
{}; 

int main(void) 
{ 
    base<int>* b = new child; 
    // could be = static_cast<base<int>*>(new child);, but useless 

    delete b; 
} 

Вы уверены, что параметры базового шаблона одинаковы?

5

C2664 жалуется на назначение, а не на литье (вы получите ошибку C2440, «static_cast»: невозможно преобразовать из ... », если приведение было недействительным).

Проблема состоит в том, что следующий не то же самое:

ParentClass<T1, T2>* 
ParentClass<MyT1, MyT2>* 

шаблона конкретизации с различными параметрами разные, несвязанные типы.

Это должно работать нормально:

ParentClass<MyT1, MyT2>* ptr; 
ptr = static_cast<ParentClass<MyT1, MyT2>* >(new ChildClass()); 

Хотя это совершенно не нужно, чтобы бросить в этом случае, так как указатель на полученный в указатель на базу преобразований неявно, так что следующее все, что вам нужно :

ptr = new ChildClass(); 
+0

Шаблонные экземпляры на самом деле одинаковы, я просто ошибочно перепутал их в простом примере кода, который я напечатал выше. T1 и T2 являются именами классов из объявления класса, MyT1 и MyT2 являются актуальными типами.Вы правы, это должно быть: 'ParentClass * ptr; ptr = static_cast *> (new ChildClass()); ' Я пробовал простое назначение (неявное литье), приведение типов и статическое кастинг в качестве экспериментов. –

+1

@DC: Вам нужно будет отредактировать свой вопрос с помощью кода _exact_, который вы пытаетесь скомпилировать. –

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