为什么宏__STL_FUNCTION_MPL_PARTIAL_ORDER应该将模板函数包含在std_pair.h中
why should the macro __STL_FUNCTION_TMPL_PARTIAL_ORDER enclose the template function in std_pair.h
今天我在stl_pair.h:中看到以下代码
#ifdef __STL_FUNCTION_TMPL_PARTIAL_ORDER
template <class _T1, class _T2>
inline bool operator!=(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
return !(__x == __y);
}
template <class _T1, class _T2>
inline bool operator>(const pair<_T1, _T2>& __x, const pair<_T1, _T2>& __y) {
return __y < __x;
}
#endif /* __STL_FUNCTION_TMPL_PARTIAL_ORDER */
我不认为模板函数与部分专业化有任何关联函数模板的。我错了吗?
编译器如何处理函数调用
在C++中调用函数模板需要经过名称查找(标准中的第3.4节)、模板参数推导载解决的神圣三位一体(第13.3节)
除了阅读C++标准中的这些部分外,您还可以在优秀的书籍《C++模板:完整指南》中阅读,或者观看Stephan T.Lavavej 的前三个核心C++视频
- 核心C++,第1个,共n个
- 核心C++,第2个,共n个
- 核心C++,n中的3个
标准一瞥
正如您自己已经发现的那样,该宏最初是在STL的SGI实现中,当时还没有C++标准,编译器对函数模板的支持非常粗略。
//*__STL_FUNCTION _TMPL_PARTIAL_ORDER:如果编译器支持//函数模板的部分排序。(又称部分函数模板的专门化//。)
要了解函数模板的部分排序的用途,这里有一段引文(如果你读了这本书并观看了链接的视频,它会变得更加清晰)。
14.5.6.2函数模板的部分排序[temp.func.order]
1如果函数模板过载,则函数模板的使用专业化可能不明确,因为模板参数推导(14.8.2)可以将功能模板专业化与更多多个函数模板声明过载的部分排序函数模板声明在以下上下文中使用选择函数模板要指向的函数模板专业化是指:
--在对的调用的过载解决过程中功能模板专业化(13.3.3);
--当采用函数模板专业化;
--当放置操作符选择要匹配的函数模板专用化的delete新的放置操作员(3.7.4.2、5.3.4);
--当朋友函数声明(14.5.4)、显式实例化(14.7.2)或显式专门化(14.7.3)是指函数模板专业化
2偏序选择两个函数中的哪一个通过转换每个模板,模板比其他模板更专业依次使用模板(见下一段)并执行模板参数使用函数类型进行推导扣除过程决定其中一个模板是否比另一个更专业。如果因此,偏订购过程。
- 函数何时会在c++中包含stack_Unwind_Resume调用
- g++ 说函数不存在,即使包含正确的标头
- 当调用switch语句中的函数时(即使函数不包含循环),似乎是永不结束的循环的问题
- 如果基类包含双指针成员,则派生类的构造函数
- C++包含函数标头会给出错误'__dest'未命名类型
- 为什么不在 c++ 容器中实现包含函数
- 如何创建用于多个源文件的全局变量/包含/函数
- 是否可以在 C++ 中使用运算符重载来更改(未修改的)包含函数的含义
- C++中包含函数定义的内容
- 包含C++函数指针的映射
- C++从包含函数名称的 char * 调用函数
- 使用包含函数名称的字符串调用函数
- 头文件中包含函数
- 在基类中,如何定义一个容器来包含函数obj,它可以是派生类的任何函数
- C++包含函数原型的保护程序
- c++传递一个.txt文件,其中包含函数名和参数
- 如何清除包含C函数声明的字符串中的注释和中间空白
- 类的向量包含函数
- 用于包含函数的C宏
- 在c++中包含函数的麻烦