是否可以有一个专门的模板类,它是模板类的成员(本身不是专门的)?
使用非模板父类可以工作:
class owner
{
template<int num>
struct s
{
int ret() { return num; }
};
};
template<>
struct owner::s<0>
{
int ret() { return 0; }
};
但是在将owner
用作模板类时,它不会:
template<typename some>
class owner
{
template<int num>
struct s
{
int ret() { return num; }
};
};
template<typename some>
struct owner<some>::s<0>
{
int ret() { return 0; }
};
搜索显示这对于函数来说是不可能的(?),但是类/结构怎么样? Specializing a templated member of a template class
答案 0 :(得分:5)
否,那是不可能的。成员类模板只有在其所有封闭类模板也都具有特殊性的情况下,才能具有特殊性。引用C ++ 2x(N4713)[temp.expl.spec] 17.8.3 / 17:
在明确的专业声明中用于类模板的成员或成员模板, 出现在名称空间范围中,成员模板及其某些封闭的类模板可能会保留 非专业的,除非声明不得明确地专门化类成员模板(如果其声明) 封闭的类模板也没有明确地专门化。
(强调我的)
在某些情况下,您可以通过将嵌套名称s
用作名称空间范围的助手的别名来解决此问题,该助手可以部分地专门化。像这样:
template <class some, int num>
struct s_helper
{
int ret() { return num; }
};
template<typename some>
class owner
{
template<int num>
using s = s_helper<some, num>;
};
template<typename some>
struct s_helper<some, 0>
{
int ret() { return 0; }
};
要减少s_helper
的曝光率,它当然可以隐藏在适当命名的内部名称空间(例如detail
)中。