Gun*_*iez 42 c++ templates metaprogramming
template<int x> struct A {
template<int y> struct B {};.
template<int y, int unused> struct C {};
};
template<int x> template<>
struct A<x>::B<x> {}; // error: enclosing class templates are not explicitly specialized
template<int x> template<int unused>
struct A<x>::C<x, unused> {}; // ok
Run Code Online (Sandbox Code Playgroud)
那么,如果外部类也不是专用的,为什么不允许内部嵌套类(或函数)的显式特化?奇怪的是,如果我只是简单地添加一个虚拟模板参数来部分地专门化内部类,我可以解决这个问题.使事情更丑陋,更复杂,但它确实有效.
我会将完全特化视为部分特化的子集 - 特别是因为您可以通过添加伪参数将每个完整的特化表示为部分.因此,部分和完全专业化之间的消歧对我来说并没有多大意义.
不幸的是,没有人在comp.std.c ++敢于回答,所以我再次以赏金把它放在这里.
注意:我需要此功能用于一组外部类的内部类的递归模板,而内部参数的特化确实取决于外部模板参数.
Vir*_*gil 27
我猜测为什么会发生这种情况:完全专业化不再是"模板类/函数",它们是"真正的"类/方法,并且具有真实(链接器可见)符号.但对于部分专用模板中的完全专用模板,这不是真的.可能这个决定只是为了简化编译器编写者的生活(并且在编写过程中使编码人员的生活变得更加困难:P).
在第一种情况下,C++标准明确禁止成员模板类的完全专业化.根据14.7.3/18:
在类模板成员或出现在命名空间作用域中的成员模板的显式特化声明中,成员模板及其某些封闭类模板可能保持非专业化,除非声明不应明确专门化类成员模板封闭类模板也没有明确专门化.
您可以通过将实际工作委托给另一个结构来解决此问题:
namespace detail
{
template <class T, class U>
struct InnerImpl {};
}
template <class T>
struct Outer
{
template <class U>
struct Inner: detail::InnerImpl<T,U>
{
};
};
Run Code Online (Sandbox Code Playgroud)
现在你可以InnerImpl
根据自己的意愿进行专业化