C++ 函数模板:为什么产生歧义?
我有以下简单的函数模板: 最大水电站:C++ 函数模板:为什么产生歧义?,c++,templates,C++,Templates,我有以下简单的函数模板: 最大水电站: template <typename T> inline T const& max (T const& a, T const& b) { return a <b? b :a; } 我的问题如下: 在这种情况下,编译器是否默认搜索std命名空间,即使我没有包含std::max所在的头文件 在全局命名空间中放置了什么?在所有情况下调用全局命名空间中的函数时是否都需要使用: 为什么max应用于integer和fl
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a <b? b :a;
}
我的问题如下:
std
命名空间,即使我没有包含std::max
所在的头文件
全局命名空间中放置了什么?在所有情况下调用全局命名空间中的函数时是否都需要使用:
max
应用于integer
和float
类型时没有歧义,而string
类型只有歧义std::max
的头文件可能包含在您包含的某些文件中
全局名称空间中放置了什么?是否需要使用::
在任何情况下调用全局命名空间中的函数时
不,只有在有歧义的时候。这就是其中之一
为什么对整数和浮点应用max时没有歧义
类型,仅对字符串类型具有歧义性
因为在命名空间std
中既没有定义int
也没有定义float
。因此,编译器不会查看该名称空间内部,因此在重载解析期间不会考虑std::max
。这不是std::string
的情况
请注意,如果您执行以下操作,则可能会触发相同的歧义:
using namespace std;
或:
另一种解释了ADL导致歧义的原因。避免这种情况的一种方法是限定对max
的调用(在本例中,使用:
将名称查找限制为全局名称空间)
另一种限制ADL的方法(可能更模糊)是使用以下语法
std::cout << "max(s1,s2): " << (max)(s1,s2) << std::endl;
// ^ ^
是的,我确信。我刚刚做了一次复查,发布的代码是完整的。非常感谢。这些对理解这个主题有很大帮助,尤其是对于Koenig查找主题。
using namespace std;
using std::max;
std::cout << "max(s1,s2): " << (max)(s1,s2) << std::endl;
// ^ ^
#include <iostream>
#include <string>
#include <algorithm>
template <typename T>
inline T const& max (T const& a, T const& b)
{
return a < b ? b : a;
}
int main()
{
std::string s1("mathematics");
std::string s2("math");
std::cout << "max(s1,s2): " << (max)(s1,s2) << std::endl;
}