上面class.pre
有一个示例类定义:
namespace N {
template<class>
struct A {
struct B;
};
}
using N::A;
template<class T> struct A<T>::B {}; // OK
template<> struct A<void> {}; // OK
标准规定
如果类头名称包含嵌套名称说明符,则该类说明符不应位于类范围内。
文本和示例似乎不同。
不包含嵌套名称说明符(但仅“依赖” using )的A<void>
模板的特化是否仍然符合要求?
clang 和 msvc 接受它,gcc 显示错误
错误:“模板结构 N::A”在其命名空间之外的显式特化必须使用嵌套名称说明符 [-fpermissive]
编辑:该示例似乎已经更改过一次(作为较小的编辑更改):https ://github.com/cplusplus/draft/commit/b6e0848db7a72560a7bfc84f16bd23abf6aab2d6 ([class.pre] 修复示例中的错误注释)
介绍原始措辞和示例评论的论文是http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2020/p1787r6.html(P1787R6:声明和在哪里找到它们)
纸上的那行是
template<> struct A<void> {}; // error: A not nominable in ::