我不熟悉模板。我刚开始学习它。为什么我在以下程序中遇到错误?
#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;
}
错误:
13 [Error] call of overloaded 'min(std::string&, std::string&)' is ambiguous
6 [Note] C min(C, C) [with C = std::basic_string<char>]
请帮帮我。
答案 0 :(得分:14)
这里有两件事情。
您的第一个问题是您只包含部分错误消息。 Here is a link to the code being complied in gcc and clang,以及产生的错误消息之一(完整):
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) {
^
有两名候选人。一个位于main.cpp:6:3
(第6行,第3个字符),另一个位于algorithm:2579:1
(第2579行,第1个字符)。
你写的其中一个,其中一个在#include <algorithm>
。
其中一个标题文件包含<algorithm>
,而您没有要求它。允许标准标题执行此操作,因为它有时很烦人。
在<algorithm>
中有一个std::min
功能模板。由于std::string
是namespace std
中模板类的实例,因此函数模板std::min
是通过名为&#34;参数依赖查找&#34;的过程找到的。或&#34; Koenig查找&#34;。 (函数重载候选者在本地搜索,也在函数参数的名称空间中搜索,并在函数参数的模板参数的名称空间中,以及在参数指向的事物的名称空间中搜索。功能等。)
还找到了您的本地函数min
,因为它与main
的正文位于同一名称空间中。
两者都是同样好的匹配,编译器无法决定你要调用哪一个。所以它会产生一个错误,告诉你这个。
gcc和clang都执行error:
然后note:
s序列。通常,错误后note:
的全部对于理解错误非常重要。
要解决此问题,请尝试调用::min
(完全限定调用),或将函数重命名为其他内容,或使您的版本与std::min
更匹配(棘手,但在某些情况下可行) ),或致电(min)(a,b)
。最后一次阻止ADL / Koenig查找,并阻止宏扩展(例如,如果某些操作系统已将#define min
宏注入其系统头中)(通过@ 0x499602D2)。
答案 1 :(得分:5)
您正在与std::min
发生名称冲突。它可能包含在您包含的其他标准库标题之一中,<iostream>
或<string>
,我的猜测可能是后者。快速解决方法是重命名您的功能。例如,将其重命名为mymin
可以正常工作。 Demo