【发布时间】:2020-11-17 17:37:15
【问题描述】:
template<class T> struct A {
struct B { };
template<class U> struct C {
void show();
};
};
template<>
template<>
void A<int>::C<int>::show(){ //#1
}
int main(){
}
考虑上面的code,在#1,它是成员类模板成员的显式特化定义。将对其应用一些规则,如下所示:
显式特化类的成员不会从类模板的成员声明中隐式实例化;相反,如果需要定义类模板特化的成员,则其自身应被显式定义。 在这种情况下,类模板显式特化的定义应在定义成员的点的范围内。显式特化类的定义与生成的特化的定义无关。也就是说,它的成员不必与生成的特化的成员具有相同的名称、类型等。显式特化类模板的成员以与普通类成员相同的方式定义,并且不使用 template 语法。定义显式特化成员类的成员时也是如此。但是,template 用于定义明确专门化的成员类模板的成员,该模板专门化为类模板。
首先,explicitly specialized class 是什么?它是否指具有明确专业化声明的实体?好像不是这个意思,请看Explicitly specialized class部分的例子
template<> template<> class A<int>::B<double>;
根据该示例,成员显式特化中的A<int> 可以称为explicitly specialized class。那么,在我的第一个示例中,A<int> 和 C<int> 都是 explicitly specialized class?我不知道。我觉得这句话explicitly specialized class 在这部分不太清楚。
请注意强调部分,这意味着封闭类模板显式特化应与其成员的显式特化定义出现在同一范围内。该成员是在全局范围内定义的,但对于出现在全局范围内的 A<int> 或 C<int> 没有任何明确的专业化定义。这个怎么解释?
顺便说一句,作为一个相反的例子:
template<class T> struct A {
struct B { };
template<class U> struct C {
void show();
};
};
template<>
template<typename U>
struct A<int>::C{ //#2
void show();
};
template<>
template<typename U>
void A<int>::C<U>::show(){ //#3
}
int main(){
}
为什么在#3 之前需要对类模板C 进行显式特化,这两个示例有什么区别?
显式特化类
本节中“显式特化类”这一短语不清楚,
成员或成员模板可以嵌套在许多封闭类模板中。在此类成员的显式特化中,成员声明之前应为 显式特化的每个封闭类模板的模板。
[ Example:
template<class T1> class A {
template<class T2> class B {
void mf();
};
};
template<> template<> class A<int>::B<double>;
template<> template<> void A<char>::B<char>::mf();
— end example ]
explicitly specialized class 是什么意思,它是指具有明确专业化声明或其他东西的实体吗?在上面的例子中,A<int> 似乎没有明确的特化。
【问题讨论】:
-
你为什么要引用那一段?您的代码中显式专门化的类在哪里?
-
缺少几件事来使该引用具有相关性。它说如果你有一个明确的类模板特化(你没有)并且该特化的成员需要一个定义,那么类模板必须在成员定义的范围内(不在同一范围内,只是可见)。
-
你的代码已经被上一段覆盖了。
-
@LanguageLawyer
explicitly specialized在这部分的写法不清楚,请看temp.expl.spec#15,示例中不包含任何enclosing class template that is explicitly specialized -
@jackX 我想是wg21.link/cwg529
标签: c++ templates language-lawyer