将子类转换为模板父类时的C2664

时间:2010-04-16 18:15:02

标签: c++ inheritance templates casting pointers

我有一个模板化的父类,以及一个实现它的子类。

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; *'

如果父项是模板化的,即使模板中指定的类型相同,是否无法在继承类型之间转换指针类型?

2 个答案:

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

您确定基本模板参数是否相同?