Здесь так много синтаксических ошибок, что я не знаю, с чего начать. В следующий раз, пожалуйста, отправьте фактический код, который вы использовали.
Для начала, я предполагаю, что вы хотели написать это:
ClassA<myenum>* a = new ClassA_1<myenum>();
Другими словами, a
- это указатель , а его тип - ClassA<myenum>*
, а не просто ClassA
(и мы проигнорируем отсутствующий аргумент для конструктора).
Теперь ваш синтаксис приведения неверен в обоих случаях. Круглые скобки должны идти только вокруг типа . Но все равно лучше использовать static_cast
:
ClassA_1<myenum>* a1 = static_cast<ClassA_1<myenum>*>(a);
Это работает.
ОБНОВЛЕНИЕ После редактирования вопроса:
Важная ошибка в этой строке:
ClassB(Param1 p1 = NULL)
вы не можете использовать NULL
в качестве параметра по умолчанию, поскольку ваш тип Param1
является , а не указателем - это перечисление (строго говоря, это должно работать, поскольку NULL
определяется как равное 0
в C ++, но, тем не менее, это логическая ошибка). Вместо того, чтобы делать параметр необязательным, лучшей альтернативой будет перегружать конструктор. В качестве альтернативы также работает следующее:
ClassB(Param1 p1 = Param1())
Используется значение по умолчанию для типа Param1
.
В коде есть дополнительная ошибка:
ClassA* ptr = new ClassB<lolcakes>(lolcakes::cakeisalie);
Константы перечисления не работают так в C ++: они не создают собственное пространство имен, поэтому их использование не может быть квалифицированным. Вместо этого опустите имя перечисления:
ClassA* ptr = new ClassB<lolcakes>(cakeisalie);
Наконец, пожалуйста, не используйте приведения в стиле C, ever . Всегда заменяйте их соответствующими приведениями в стиле C ++. В вашем случае замените
ClassB<lolcakes>* a1 = (ClassB<lolcakes>*)ptr;
с
ClassB<lolcakes>* a1 = boost::polymorphic_downcast<ClassB<lolcakes>*>(ptr);
// or
ClassB<lolcakes>* a1 = static_cast<ClassB<lolcakes>*>(ptr);