C++ 模板函数调用歧义错误

C++ 模板函数调用歧义错误,c++,templates,ambiguous,ambiguity,ambiguous-call,C++,Templates,Ambiguous,Ambiguity,Ambiguous Call,我不熟悉模板。我刚开始学。为什么我在下面的程序中出错 #include <iostream> #include <string> using std::cout; using std::string; template<class C> C min(C a,C b) { return a<b?a:b; } int main() { string a="first string"; string b="second string";

我不熟悉模板。我刚开始学。为什么我在下面的程序中出错

#include <iostream>
#include <string>
using std::cout;
using std::string;
template<class C>
C min(C a,C b) {
    return a<b?a:b;
}
int main()
{
    string a="first string";
    string b="second string";
    cout<<"minimum string is: "<<min(a,b)<<'\n';
    int c=3,d=5;
    cout<<"minimum number is: "<<min(c,d)<<'\n';
    double e{3.3},f{6.6};
    cout<<"minimum number is: "<<min(e,f)<<'\n';
    char g{'a'},h{'b'};
    cout<<"minimum number is: "<<min(g,h)<<'\n';
    return 0;
}
#包括
#包括
使用std::cout;
使用std::string;
模板
C最小值(C a,C b){

返回一个您正与
std::min
发生名称冲突。它可能包含在您包含的另一个标准库头中,
,我猜可能是后者。快速修复方法是重命名您的函数。例如,将其重命名为
mymin
可以正常工作。

这里发生了两件事

您的第一个问题是,您只包含了部分错误消息,以及其中一条生成的错误消息(完整):

main.cpp:13:34:错误:对“min”的调用不明确

你用的是什么编译器?它会让你的
中定义了一个min函数。我重命名了这个类,它执行得很好()。不确定为什么
min
std::min
冲突@Mahesh:您是否在不重命名的情况下复制了该问题?重命名您的min函数以简化操作!@meet如果您使用的是Visual Studio,则在编译设置中有一个名为
Show Includes
的选项。这应该会让您了解其中包含的所有标题程序。@但冲突是如何发生的。我没有使用命名空间std;?您不需要,因为
std::string
在标准库命名空间中,它将通过参数相关查找(ADL)解析
std::min
。它看起来像
或do
(min)(a,b)
:)@0x499602D2:谢谢,它能工作。但它是如何工作的?最小值(a,b)的含义是什么?@meet
(min)
不是函数调用表达式,因此不会使用ADL。
13  [Error] call of overloaded 'min(std::string&, std::string&)' is ambiguous

6   [Note] C min(C, C) [with C = std::basic_string<char>]
main.cpp:13:34: error: call to 'min' is ambiguous
    cout<<"minimum string is: "<<min(a,b)<<'\n';
                                 ^~~
/usr/include/c++/v1/algorithm:2579:1: note: candidate function [with _Tp = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
min(const _Tp& __a, const _Tp& __b)
^
main.cpp:6:3: note: candidate function [with C = std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >]
C min(C a,C b) {
  ^