gpt4 book ai didi

c++ - 在哪里声明类成员模板的偏特化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:55:35 24 4
gpt4 key购买 nike

在 stackoverflow 上,我发现了一些评论(例如,请参见 jrokthis 问题的评论)指出类成员模板的部分特化在非命名空间范围内是允许的(与显式特化相反)就像下面的例子:

class A {
template <class T, class U>
class B {};
template <class U>
class B<void, U> {};
};

另外,这个例子用 gcc 和 clang 编译得很好。然而,在 c++03 标准文本中,我只能找到关于此问题的 14.5.4 [temp.class.spec] §6(或 c++11 中的 14.5.5 §5):

A class template partial specialization may be declared or redeclared in any namespace scope in which its definition may be defined (14.5.1 and 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*> { };

那么,非命名空间范围内的类模板偏特化怎么样?标准允许它们吗?我在哪里可以找到相关文本?

具体来说,我的示例是否有效(如果封闭类是模板,它是否仍然有效)?如果不是,当前的编译器是否错误地按照上述方式编译我的示例?

最佳答案

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

If a member template of a class template is partially specialized, the member template partial specializations are member templates of the enclosing class template; [...] [Example:

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

end example ]

恕我直言,这不是很明确;它不允许类定义内部的部分特化,而是(对我来说,似乎)指定如何处理成员模板特化。


另见 Core Language Issue 708EWG Issue 41 .

关于c++ - 在哪里声明类成员模板的偏特化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19861596/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com