作为模板类成员的模板类的专业化

Aar*_*man 8 c++ templates

是否可以有一个专门的模板类,它是模板类的成员(本身不是专门的)?

对于非模板父类,它可以工作:

class owner
{
    template<int num>
    struct s
    {
        int ret() { return num; }
    };
};

template<>
struct owner::s<0>
{
    int ret() { return 0; }
};
Run Code Online (Sandbox Code Playgroud)

但是在制作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; }
};
Run Code Online (Sandbox Code Playgroud)

搜索表明函数不可能(?),但是类/结构怎么样? 专门化模板类的模板成员

Rei*_*ica 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; }
};
Run Code Online (Sandbox Code Playgroud)

为了减少的曝光s_helper,它当然可以隐藏在适当命名的内部名称空间(例如中detail)中。