模板类内部使用类模板参数定义类型别名的编译错误及特化快捷方式实现咨询
模板类内部使用类模板参数定义类型别名的编译错误及特化快捷方式实现咨询
嘿,我来帮你捋清楚这个问题!首先咱们先拆解编译错误的根源:
你当前的模板参数TypA是普通类型参数(用typename声明),也就是说当你实例化MyClass<A<X>, X>时,TypA已经是A<X>这个实例化后的具体类型了,而非A这个模板本身。这时候你写TypA<TypX>,编译器自然会报错——它会认为“TypA不是模板,没法加<TypX>这种模板实例化语法”。
接下来给你两种解决思路,同时实现你想要的特化快捷方式:
思路一:改用模板模板参数直接实现快捷方式
如果你希望TypA是一个模板(比如A)而非实例化后的类型,可以把模板参数改成模板模板参数,这样直接就能实现你要的快捷效果:
template<template<typename> typename TypATemplate, typename TypX> struct MyClass { using TypAlias = TypATemplate<TypX>; // 此时TypATemplate是模板,语法合法 };
之后你想得到A<X>的类型别名时,直接写MyClass<A, X>就可以了,不用再繁琐地写MyClass<A<X>, X>,完美契合你的快捷需求。
思路二:保留原参数结构,用别名模板做快捷方式
如果因为某些限制必须保留原模板的参数形式(typename TypA, typename TypX),可以用别名模板来创建快捷入口,同时修正内部的类型别名定义:
// 保留原模板结构 template<typename TypA, typename TypX> struct MyClass { using TypAlias = TypA; // 直接用传入的TypA即可,因为你特化时传的就是A<X> }; // 快捷方式:自动帮你生成MyClass<A<X>, X>的别名模板 template<template<typename> typename TypATemplate, typename TypX> using MyClassShortcut = MyClass<TypATemplate<TypX>, TypX>;
之后你只需要写MyClassShortcut<A, X>,就完全等价于MyClass<A<X>, X>,满足你的使用习惯。
扩展:支持多参数模板
如果你的目标模板是多参数的(比如template<typename T1, typename T2> struct A),只需要调整模板模板参数的写法即可:
template<template<typename, typename> typename TypATemplate, typename TypX, typename TypY> struct MyClass { using TypAlias = TypATemplate<TypX, TypY>; };
内容来源于stack exchange
相关产品推荐
相关产品推荐

