我有以下模板:
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;
};
(是的,我还需要第二个参数作为第一个的内部类。)
答案 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> {
};
};