如何在内部命名空间中特化父命名空间的模板类AStruct?
在嵌套命名空间中特化父命名空间的模板类
问题代码
原尝试的特化代码如下:
namespace A { template<typename T, typename... Ts> struct AStruct; } namespace A::B { template<> struct A::AStruct<double> { using K = int; }; }
报错信息
编译时出现错误:
error: declaration of 'struct A::AStruct<double>' in namespace 'A::B' which does not enclose 'A' 10 | struct A::AStruct<double> | ^~~~~~~~~~~~~~~
解决方案
C++标准要求,模板的特化必须声明在原模板所在的命名空间(或其直接外围命名空间的子命名空间内),不能在子命名空间中通过父命名空间限定符直接特化。有两种正确写法:
写法一:在A的子命名空间B中直接特化
利用子命名空间可访问父命名空间成员的特性,省略父命名空间限定符直接编写模板特化:
namespace A { template<typename T, typename... Ts> struct AStruct; } namespace A::B { template<> struct AStruct<double> { using K = int; }; }
写法二:回到原模板所在的A命名空间内完成特化
在A命名空间内嵌套B命名空间,直接完成特化声明:
namespace A { template<typename T, typename... Ts> struct AStruct; namespace B { template<> struct AStruct<double> { using K = int; }; } }
两种写法均符合C++模板特化规则,能正确完成父命名空间模板的特化。
内容的提问来源于stack exchange,提问作者rsvar67
相关产品推荐
相关产品推荐

