背景:我试图回答问题Why isn't my overloading < operator not working for STL sort。我的一个建议(除了使用谓词)是在命名空间std中移动operator <
的自定义std::string
,以便编译器可以优先于模板化版本。
以闪电般的速度,答案被评选为以下来自一位知名用户的评论:
这是未定义的行为,不允许添加声明 命名空间std,因为它可以改变标准的行为 库组件
我的问题:
即使此专业化的声明不包含用户定义的数据类型,是否可以为stl类型添加模板专门化?
P.S。我删除了我的答案,因为我担心这可能是错的
答案 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类之间保持一致。