C2664 при приведении дочернего класса к шаблонному родительскому классу - PullRequest
2 голосов
/ 16 апреля 2010

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

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

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

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

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

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

ошибка C2664: невозможно преобразовать параметр 1 из 'ParentClass *' в 'ParentClass *'

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

Ответы [ 2 ]

5 голосов
/ 16 апреля 2010

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();
1 голос
/ 16 апреля 2010

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

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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...