如何在同一hpp文件的另一类中声明类模板RBT_COMMON_PACKAGE的指针
错误根因
RBT_COMMON_PACKAGE是带两个参数的类模板,模板本身不是可直接使用的具体类型,必须传入模板参数实例化后才能用来声明变量或指针,所以编译器会抛出2955错误。
除此之外你的原始代码还存在两处语法问题:
- 模板前向声明后多写了分号,两个类的定义结尾都缺少必需的分号
- 模板类的类体没有和模板声明绑定
解决方案
场景1:PROTECT类固定使用某组参数的RBT_COMMON_PACKAGE
如果你确定p0、p1只会指向某组固定参数的RBT_COMMON_PACKAGE实例,直接在声明指针时补全模板参数即可:
template< class T , int N> class RBT_COMMON_PACKAGE { public: COORDINATES start; COORDINATES target; RBT_CAR world_start; RBT_CAR world_target; //RBT_CAR_PNT via; int prep; int type; }; // 类定义结尾必须加补分号 class PROTECT { private: // 示例参数为T=int、N=10,可替换为你实际需要的参数 RBT_COMMON_PACKAGE<int, 10> *p0; RBT_COMMON_PACKAGE<int, 10> *p1; }; // 类定义结尾必须加补分号
场景2:PROTECT类需要适配不同参数的RBT_COMMON_PACKAGE
把PROTECT也定义为模板类,将RBT_COMMON_PACKAGE需要的参数作为PROTECT的模板参数传递即可:
template< class T , int N> class RBT_COMMON_PACKAGE { public: COORDINATES start; COORDINATES target; RBT_CAR world_start; RBT_CAR world_target; int prep; int type; }; // PROTECT定义为模板类,接收和RBT_COMMON_PACKAGE一致的模板参数 template< class T , int N> class PROTECT { private: RBT_COMMON_PACKAGE<T, N> *p0; RBT_COMMON_PACKAGE<T, N> *p1; };
场景3:PROTECT的成员指针需要指向任意参数的RBT_COMMON_PACKAGE实例
给RBT_COMMON_PACKAGE新增一个非模板基类,所有模板实例都继承这个基类,PROTECT内存储基类指针即可:
// 非模板基类,可定义公共虚接口 class RBT_COMMON_PACKAGE_BASE { public: virtual ~RBT_COMMON_PACKAGE_BASE() = default; int prep; int type; }; template< class T , int N> class RBT_COMMON_PACKAGE : public RBT_COMMON_PACKAGE_BASE { public: COORDINATES start; COORDINATES target; RBT_CAR world_start; RBT_CAR world_target; }; class PROTECT { private: // 基类指针可指向任意模板参数的RBT_COMMON_PACKAGE实例 RBT_COMMON_PACKAGE_BASE *p0; RBT_COMMON_PACKAGE_BASE *p1; };
内容的提问来源于stack exchange,提问作者jch007
相关产品推荐
相关产品推荐

