算法头文件中不是已经有max函数了吗? 通过using namespace std;
,我将函数导入全局命名空间(它接受参数,在这种情况下两者都是整数,所以它不应该是重载)。
那么为什么没有任何命名冲突呢?
#include <iostream>
#include <algorithm>
using namespace std;
int max(int a, int b)
{
return (a > b) ? a : b;
}
int main()
{
cout << max(5, 10) << endl;
}
那么为什么没有任何命名冲突呢?
您正在声明一个非模板max
,std::max
是一组重载的函数模板,因此它们都是重载的。并且在此处的重载解析中选择全局命名空间中声明的非模板版本。
如果隐式,F1 被确定为比 F2 更好的函数 F1 所有参数的转换并不比隐式参数差 F2 的所有参数的转换,以及
。
- 或者,如果不是这样,F1 是一个非模板函数,而 F2 是一个 模板专业化
。
通过
using namespace std
我将函数导入全局命名空间
这是一个常见的误解。不导入任何内容。 实际上,将指令using namespace std;
放在全局命名空间中意味着在全局命名空间中查找名称时,也会在命名空间std
中查找该名称。
std::max
函数仍然在命名空间std
中,它不在全局命名空间中。
您的max
声明很好,因为您声明::max
这是一个单独的实体std::max
。
当您进行非限定函数调用max
时,将在全局命名空间中查找该名称,也会在namespace std
中查找该名称。
这两个查找的结果都会导致一个重载集,该重载集由称为::max
和std::max
的所有函数签名组成。
然后,重载解析从提供的参数的重载集中选择最佳匹配,事实证明::max
是更好的匹配,因为非模板函数比函数模板更匹配,所有其他条件相同。