在std命名空间中添加模板特化

时间:2014-09-23 10:25:43

标签: c++ stl language-lawyer

背景:我试图回答问题Why isn't my overloading < operator not working for STL sort。我的一个建议(除了使用谓词)是在命名空间std中移动operator <的自定义std::string,以便编译器可以优先于模板化版本。

以闪电般的速度,答案被评选为以下来自一位知名用户的评论:

  

这是未定义的行为,不允许添加声明   命名空间std,因为它可以改变标准的行为   库组件

我的问题:
即使此专业化的声明不包含用户定义的数据类型,是否可以为stl类型添加模板专门化?


P.S。我删除了我的答案,因为我担心这可能是错的

4 个答案:

答案 0 :(得分:12)

C ++ 11,[namespace.std]§1:

  

如果将C ++程序的声明或定义添加到命名空间std或者   命名空间std中的命名空间,除非另有说明。程序可以添加模板专业化   仅当声明取决于用户定义的类型时,才能将任何标准库模板添加到命名空间std   并且专业化符合原始模板的标准库要求,并未明确说明   禁止的。

以上段落明确禁止不依赖于用户定义类型的专业化。

关于动机:你不会添加模板专业化,而是单独的声明,这也是禁止的。

答案 1 :(得分:5)

Angew得到了相关的引用,但解释是有缺陷的。

您建议在namespace std中添加模板专精。如果它取决于用户定义的类型,则允许。你特别提到它没有。因此,不满足异常的前提条件,并且适用基本规则(无添加)。不行。

答案 2 :(得分:1)

标准库足够灵活,为分配器,谓词等提供了许多额外的参数。因此,如果您要将某些内容添加到std命名空间,那么您似乎是通过错误的方式追求目标。

休息一下以改变主意,然后阅读STL资源并按照它进行游戏。

答案 3 :(得分:0)

STL类旨在以明确定义的方式使用,即使用POD类型实例化它们,或者符合类要求的STL类,或实现类要求的用户定义类型。

你也不应该从STL类型继承;最好用STL对象作为成员创建一个新类;然后,您可以实现与STL对象的方法签名匹配的公共方法。

没有涉及此规则的所有基本原理,这是使用STL类的最便携且可能长寿的方法。它在特定于应用程序的类和STL类之间保持一致。