类模板特化后如何调用主模板中的普通函数?
类模板特化后调用主模板普通函数的实现方案
完全特化的A<1>是独立于主模板A<i>的类定义,默认情况下没有继承主模板的任何成员,所以直接调用a1.func()会编译失败。要实现调用主模板的func(),可以采用以下几种方案:
方案1:让特化类继承主模板实例
修改特化类的定义,使其继承主模板的某个合法实例,从而继承到func()成员:
template<> class A<1> : public A<0> { // 继承任意合法的主模板实例,例如A<0> public: void func1() { std::cout << "A1" << std::endl; } };
此时A<1>的对象即可直接调用func(),因为该成员继承自主模板的A<0>。
方案2:提取共用成员到非模板基类
将主模板和特化类的共用成员(如func())抽离到一个非模板基类中,让主模板和特化类都继承该基类:
// 共用基类,存放通用成员函数 class ABase { public: void func() { std::cout << "A" << std::endl; } }; // 主模板继承基类 template<int i> class A : public ABase { // 主模板可添加自身专属成员 }; // 特化版本同样继承基类 template<> class A<1> : public ABase { public: void func1() { std::cout << "A1" << std::endl; } };
这种方式逻辑清晰,适合多个特化版本需要复用同一组成员函数的场景。
方案3:在特化类中显式复用主模板函数实现
如果不想使用继承,可以在特化类中手动实现func(),并在内部调用主模板实例的func():
template<> class A<1> { public: void func1() { std::cout << "A1" << std::endl; } void func() { A<0>().func(); // 创建主模板实例并调用其func() } };
注意:这种方式会创建新的主模板实例,若func()依赖对象自身状态,该方案可能不符合需求。
内容的提问来源于stack exchange,提问作者f1msch
相关产品推荐
相关产品推荐

