模板中模板类型相关结构的专业化

Fer*_*eak 3 c++ templates

我试图创建一个模板化类的部分专用成员,其中内部类的模板类型来自外部类...以下:

template<typename T>
struct Num
{
    template <T n>
    struct VH
    {
        enum { value = n };
        T v = value;
    };
};

template <typename T> struct Num<T>::VH<0>
{
    enum {value = 1};
    T v = value;
};

template <typename T> struct Num<T>::VH<1>
{
    enum {value = 0};
    T v = value;
};
Run Code Online (Sandbox Code Playgroud)

失败了

error: too few template-parameter-lists
     template <typename T> struct Num<T>::VH<0>
Run Code Online (Sandbox Code Playgroud)

以下内容:

template <typename T> struct Num<T>::template<> VH<0>
{
    enum {value = 0};
    T v = value;
};

template <typename T> struct Num<T>::template<> VH<1>
{
    enum {value = 1};
    T v = value;
};
Run Code Online (Sandbox Code Playgroud)

只是感觉不对(error: expected template-id before '<' token template <typename T> struct Num<T>::template<> VH<0>)

并且在读取模板类成员函数显式特化之后 如下

template <typename T> template<> struct Num<T>::VH<0>
{
    enum {value = 0};
    T v = value;
};

template <typename T> template <> struct Num<T>::VH<1>
{
    enum {value = 1};
    T v = value;
};
Run Code Online (Sandbox Code Playgroud)

给出错误:

error: invalid explicit specialization before '>' token
 template <typename T> template<> struct Num<T>::VH<0>
                                ^
error: enclosing class templates are not explicitly specialized
error: template parameters not used in partial specialization:
 template <typename T> template<> struct Num<T>::VH<0>
                                                 ^
error:         'T'
Run Code Online (Sandbox Code Playgroud)

任何人都可以让我知道正确的语法,我现在似乎无法弄清楚...?

Jar*_*d42 5

语法是

template <typename T>
template <>
struct Num<T>::VH<0>
{
    enum {value = 1};
    T v = value;
};
Run Code Online (Sandbox Code Playgroud)

但不幸的是,不可能完全专门化内部结构.但你可以部分专门化它:

template<typename T>
struct Num
{
    template <T n, int dummy = 0> // Add extra dummy for partial specialization
    struct VH
    {
        enum { value = n };
        T v = value;
    };
};
Run Code Online (Sandbox Code Playgroud)

template <typename T>
template <int dummy>
struct Num<T>::VH<0, dummy>
{
    enum {value = 1};
    T v = value;
};
Run Code Online (Sandbox Code Playgroud)

演示