仅专门嵌套模板

时间:2014-09-25 18:04:10

标签: c++ templates template-specialization typename dependent-name

我有以下模板:

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

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

1 个答案:

答案 0 :(得分:4)

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

  

在类的成员的显式专门化声明中   模板或出现在命名空间范围内的成员模板   成员模板及其一些封闭的类模板可能会保留   unspecialized,,但声明不得明确   如果它包含类模板,则专门化一个类成员模板   也没有明确的专业。

您可以使用“部分”专精而使用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> { 
    };
};