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
    类型只有歧义

  • 仅供参考:我正在使用gcc 4.5.3进行编译。 谢谢大家!

    在这种情况下,编译器是否默认搜索std名称空间 甚至我也没有包括std::max所在的头文件 定位

    是的,这个叫。请注意,定义了
    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;
    }