C++14模板化虚基类指针赋值报错问题求助
问题:模板化虚基类的指针转换编译错误
先看正常工作的非模板虚基类实现:
class BaseClass_B { public: BaseClass_B() {} virtual ~BaseClass_B() {} virtual void method(const int &fParam) const = 0; }; template <class tDerivedClassParam> class DerivedClass_B : public BaseClass_B { void method(const int &fParam) const override final { // Do something useful } }; class FinalClass_B { public: using TypeAlias = int; };
这段代码可以正常创建派生类对象,并将其地址赋值给派生类指针和基类指针:
DerivedClass_B<FinalClass_B> object_B; DerivedClass_B<FinalClass_B> *ptr_B; BaseClass_B *basePtr_B; ptr_B = &object_B; basePtr_B = &object_B;
但当使用模板化虚基类时,出现了编译错误:
template <class tBaseClassParam> class BaseClass_A { public: BaseClass_A() {} virtual ~BaseClass_A() {} virtual void method(const int &fParam) const = 0; }; // 注意:BaseClass_A<> 使用了 FinalClass_A 的类型别名 template <class tDerivedClassParam> class DerivedClass_A : public BaseClass_A<typename tDerivedClassParam::TypeAlias> { void method(const int &fParam) const override final { // Do something useful } }; class FinalClass_A { public: using TypeAlias = int; };
尝试执行以下代码时,最后一行触发编译错误:
DerivedClass_A<FinalClass_A> object_A; DerivedClass_A<FinalClass_A> *ptr_A; BaseClass_A<FinalClass_A> *basePtr_A; ptr_A = &object_A; basePtr_A = &object_A; // <-- 编译错误
编译器错误信息:
error: cannot convert ‘DerivedClass_A<FinalClass_A>’ to ‘BaseClass_A<FinalClass_A>’ in assignment
问题原因
你忽略了模板类的不同实例是完全独立的类型这一点:
DerivedClass_A<FinalClass_A>继承的基类是BaseClass_A<int>,因为FinalClass_A::TypeAlias被定义为int。- 而你声明的指针
basePtr_A类型是BaseClass_A<FinalClass_A>,这和BaseClass_A<int>是毫无继承关系的两个不同类型,自然无法进行指针转换。
修正方案
把基类指针的类型改成实际继承的那个模板实例即可:
DerivedClass_A<FinalClass_A> object_A; DerivedClass_A<FinalClass_A> *ptr_A; BaseClass_A<int> *basePtr_A; // 这里改成 int,匹配 TypeAlias 的类型 ptr_A = &object_A; basePtr_A = &object_A; // 现在可以正常编译
或者为了避免硬编码类型,用类型别名保持关联性:
using TargetBaseType = BaseClass_A<typename FinalClass_A::TypeAlias>; DerivedClass_A<FinalClass_A> object_A; DerivedClass_A<FinalClass_A> *ptr_A; TargetBaseType *basePtr_A; ptr_A = &object_A; basePtr_A = &object_A;
内容的提问来源于stack exchange,提问作者Nilsie
相关产品推荐
相关产品推荐

