3

我有以下模板:

template<typename FirstParam>
struct First
{
    template<typename SecondParam>
    struct Second;
};

专业化示例:

template<typename T> class D {};

template<>
template<>
struct First<C1>::Second<C1::C2>
{
    typedef D<C1::C2> type;
};

这是两个类同时专业化的情况。但是有可能只专攻二等吗?

就像是:

template<typename OuterParam>
template<>
struct Outer<OuterParam>::Inner<typename OuterParam::C2>
{
    typedef E<typename OuterParam::C2> type;
};

(是的,我还需要第二个参数成为第一个参数的内部类。)

4

1 回答 1

4

No. §14.7.3 [temp.expl.spec]/p16,重点补充:

在类模板的成员或出现在命名空间范围内的成员模板的显式特化声明中,成员模板和它的一些封闭类模板可能保持未特化,除非声明不应显式特化类成员模板,如果它封闭类模板也没有明确专门化。

您可以使用“部分”专业化,std::is_same而不是:

template<typename FirstParam>
struct First
{
    template<typename SecondParam, bool = std::is_same<typename FirstParam::C2,
                                                       SecondParam>::value>
    struct Second;

    template<class T>
    struct Second<T, true> { 
    };
};
于 2014-09-25T18:09:11.803 回答