首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >关于非专用模板成员模板专门化的C++标准段落

关于非专用模板成员模板专门化的C++标准段落
EN

Stack Overflow用户
提问于 2018-04-20 20:40:18
回答 1查看 113关注 0票数 3

在目前的C++标准草案中,[temp.expl.spec]第18页一段说:

非专门化类模板的成员函数模板、成员类模板或静态数据成员模板的专门化本身就是模板。

然而,上面这一段tem.ex.specp.17(http://eel.is/c++draft/temp.expl.spec#17)指出(我的重点):

在出现在命名空间范围中的类模板或成员模板的成员的显式专门化声明中,成员模板及其一些封装类模板可能仍然是非专门化的,,除非声明不显式地专门化类成员模板,如果其封装类模板也不是显式专门化的话,。..。

因此,如果不专门化成员模板,那么就不可能显式地专门化成员模板,因此是错误的。我显式地突出了这个词,因为tem.ex.specp.18写着“一个专门化.”。专业化可以有很多含义,其中之一可以是明确的专业化。

我检查了,并在tem.ex.specp.17之前在标准中出现了tem.ex.specp.18。例如,在1996年版本的标准中,tem.ex.specp.18是存在的,而tem.ex.specp.17则不存在。

18的最初意图是什么?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2018-06-07 01:13:03

可以对非专门类模板的成员类模板进行部分专门化。

您的第17点禁止这样的成员完全专业化;第18点澄清了在这种情况下的部分专门化仍然是一个模板。

“明确专业化”一词指的是完全专业化,而不包括部分专业化。

代码语言:javascript
复制
template<typename T>
struct A
{
     template<typename U, typename V>
     struct B
     { 
         void f() {}
     };
};

// OK: Partially specialize A<T>::B. This is a template
template<typename T>
template<typename U>
struct A<T>::B<U, int>   
{
    void g() {}
};
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49949416

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档