我在另一个模板中嵌套了一个类模板。部分地专门化它很容易:我只是在它的父块中声明另一个template< … >块。
但是,我需要另一个部分专门化,它恰好指定了所有本地模板参数。这使得它成为一个显式的专门化。无论出于什么原因,显式的专门化必须在命名空间范围内。若要在父类之外声明它,必须指定父类,这需要一个非空模板参数列表。这意味着部分专业化。部分专业化是我要做的,它应该在任意的外部范围内工作。但是GCC和Comeau都没有用部分专业化的形式参数来识别父母提名中的模板参数。
template< class X > struct A {
template< class Y > struct B; // initial declaration OK
template< class Z >
struct B< A< Z > > {}; // partial OK as long as there's a local arg
template<> // ERROR: this syntax triggers explicit specialization
struct B< int > {};
};
template<> // ERROR: can't nest template<>s here (why?)
template< class X > // ERROR: can't deduce X from type of A<X>::B<int> (why?)
struct A< X >::B< int > {};(我把所有不工作的代码都留在了里面;对它进行适当的注释,以使其有意义。)
发布于 2010-01-06 12:41:47
根据C++标准14.7.3/18,这是非法的:
……如果类成员模板的封闭类模板也不是显式专门化的,则声明不应显式地专门化类成员模板。
发布于 2010-01-06 18:11:17
我倾向于不过多地使用嵌套类。我的主要抱怨是,他们有一种倾向于膨胀他们嵌套的类的代码。
因此,我建议另一个解决办法:
namespace detail
{
template <class X, class Z> class BImpl;
template <class X, class Z> class BImpl<X, A<Z> > {};
template <class X> class BImpl<X,int> {};
}
template <class X>
class A
{
template <class Z> struct B: BImpl<X,Z> {};
};请注意,它需要将X作为参数传递给BImpl,如果您希望也专门化A的话。有趣的是,在这种情况下,我只得到了部分专业化!
发布于 2010-01-06 00:29:31
复杂的东西。你的初始代码是VC10 Beta2,很好。
首先,我觉得你倒过来了:
template<>
template< class X >
struct A< X >::B< int > {};X是结构A的模板参数,而B是完全专门化的,所以我认为应该是这样的:
template< class X >
template<>
struct A< X >::B< int > {};但即使这样也无法编译。但是,错误文本实际上是有用的:
a.cpp a.cpp(11):C3212:'A::B‘:模板成员的显式专门化必须是显式专门化a.cpp(8)的成员:参见'A::B’的声明
如果你也完全专攻A,那么完全专门化B似乎是合法的。
编辑:好的,我收到了一些能权威地谈论这个问题的人的回复--套用一下,这是标准中一个非常模糊的领域,而清理它是C++委员会的一个悬而未决的问题(" it“是类模板成员的明确的专门化)。在短期内,建议是“不要那样做”。
https://stackoverflow.com/questions/2009924
复制相似问题