C++ 在哪里声明类成员模板的部分专门化?

C++ 在哪里声明类成员模板的部分专门化?,c++,templates,C++,Templates,在stackoverflow上,我发现了几条注释(例如,请参见问题中的注释),指出允许在非命名空间范围内对类成员模板进行部分专门化(与显式专门化相反),如下例所示: class A { template <class T, class U> class B {}; template <class U> class B<void, U> {}; }; A类{ 模板 B类{}; 模板 B类{}; }; 另外,这个例子可以很好地编

在stackoverflow上,我发现了几条注释(例如,请参见问题中的注释),指出允许在非命名空间范围内对类成员模板进行部分专门化(与显式专门化相反),如下例所示:

class A {
    template <class T, class U>
    class B {};
    template <class U>
    class B<void, U> {};
};
A类{
模板
B类{};
模板
B类{};
};
另外,这个例子可以很好地编译gcc和clang。但是,在c++03标准文本中,我只能找到14.5.4[temp.class.spec]§6(或c++11中的14.5.5§5)中关于此问题的内容:

类模板部分专门化可以在定义其定义的任何命名空间范围内声明或重新声明(14.5.1和14.5.2)

以及以下示例:

template<class T> struct A {
    class C {
        template<class T2> struct B { };
    };
};

// partial specialization of A<T>::C::B<T2>
template<class T> template<class T2>
struct A<T>::C::B<T2*> { };
模板结构A{
C类{
模板结构B{};
};
};
//A::C::B的部分专门化
模板
结构A::C::B{};
那么,非命名空间范围的类模板部分专门化如何?标准允许吗?我在哪里可以找到相关的文本


具体地说,我的示例有效吗(如果封闭类是模板,它还会有效吗)?如果不是,那么当前的编译器是否错误地编译了我上面提到的示例?

这似乎有点令人困惑,因为我同意您引用的段落似乎不允许类定义中的部分专门化。但是,有[temp.class.spec.mfunc]/2:

如果类模板的成员模板部分专用,则 成员模板部分专门化是 封闭类模板;[…][示例:

模板结构A{
模板结构B{};//#1
模板结构B{};//#2
};
模板模板结构A::B{};//#3
A::B abcip;//使用#2
A::B absip;//使用#3
A::B abci;//使用#1
-[结束示例]

我觉得这不是很明确;它不允许在类定义中进行部分专门化,而是(对我来说)指定如何处理成员模板专门化



另请参见和。

我发现这个答案非常不令人满意:(但是评论太长了。我也注意到了这一点。然而,尽管标准提供了示例,但它实际上并没有回答问题。如果你愿意,我可以将其添加到我的问题中。关于:在我看来,正确的行为是由你在回答中引用的确切段落指定的。或者我遗漏了什么?
template<class T> struct A {
    template<class T2> struct B {}; // #1
    template<class T2> struct B<T2*> {}; // #2
};

template<> template<class T2> struct A<short>::B {}; // #3

A<char>::B<int*> abcip; // uses #2
A<short>::B<int*> absip; // uses #3
A<char>::B<int> abci; // uses #1