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

时间:2015-11-17 13:33:45

标签: 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;
};

失败
error: too few template-parameter-lists
     template <typename T> struct Num<T>::VH<0>

以及以下内容:

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;
};

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

阅读后 explicit specialization of template class member function 以下

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;
};

给出错误:

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'

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

1 个答案:

答案 0 :(得分:5)

语法为

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

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

使用

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;
    };
};

待办事项

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

Demo