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 ++敢于回答,所以我再次以赏金把它放在这里.
注意:我需要此功能用于一组外部类的内部类的递归模板,而内部参数的特化确实取决于外部模板参数.
有一个大脑放屁......是否有可能做出像这样的工作?
template<int a> struct Foo
{
template<int b> struct Bar;
};
template<int a> struct Foo<a>::Bar<1> //Trying to specialize Bar
{
};
Run Code Online (Sandbox Code Playgroud)
我不具备这样做的,但它可以让我很好地隐藏命名空间范围的一些实施细节.
建议赞赏!
PS:我忘了提到语言不支持明确专门针对Foo范围内的Bar.无论如何,AFAICS.
当它的参数全部已知时,我无法专门化内部模板.这是一个例子:
template < typename T0 >
struct outer
{
template < typename T1 = void, typename T2 = void >
struct inner
{
typedef T1 type;
};
};
template < typename T0 >
template < typename T1 >
struct outer<T0>::inner<double,T1> { typedef int type; };
Run Code Online (Sandbox Code Playgroud)
这很好用.如果我改为像这样指定内部模板,它不会:
template < typename T0 >
template < >
struct outer<T0>::inner<double,void> { typedef int type; };
Run Code Online (Sandbox Code Playgroud)
为此,我得到错误消息,"'''令牌之前的无效显式专门化......封闭类模板没有明确专门化......模板参数未在部分特化中使用:... T0".不确定WTAF会在这里发生.
我也试过这个:
template < typename T0 >
struct outer<T0>::inner<double,void> { typedef int type; };
Run Code Online (Sandbox Code Playgroud)
我预计这会失败,错误信息也就不足为奇了.它是:"模板参数列表太少".
那么,这样做的正确方法是什么?我当然可以解决它,但如果我没有,我宁愿不这样做.