我有一个模板化的父类,以及一个实现它的子类。
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:无法从'ParentClass&lt;转换参数1 T1,T2和GT; *'到'ParentClass&lt; T1,T2和GT; *'
如果父项是模板化的,即使模板中指定的类型相同,是否无法在继承类型之间转换指针类型?
答案 0 :(得分: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();
答案 1 :(得分: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;
}
您确定基本模板参数是否相同?