【问题标题】:Specialization of template type dependant structure in a template模板中模板类型依赖结构的特化
【发布时间】:2015-11-17 13:33:44
【问题描述】:

我正在尝试创建一个模板类的部分专用成员,其中内部类的模板类型是来自外部类的模板类型......如下:

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'

谁能告诉我正确的语法,我现在似乎无法弄清楚......?

【问题讨论】:

    标签: c++ templates


    【解决方案1】:

    语法是

    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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多