我对模板不熟悉。我刚刚开始学习它。为什么在以下程序中出现错误?
#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>]
请帮我。
这里有两件事。
您的第一个问题是您只包括了部分错误消息。这是gcc和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
中的模板类的实例,通过称为“依赖于参数的查找”或“ Koenig查找”的过程找到namespace std
功能模板std::min
。(在本地,函数自变量的名称空间,模板自变量的名称空间,函数自变量所指向的事物的名称空间中搜索函数重载候选对象。功能等)
min
还可以找到您的本地函数,因为它与的主体位于相同的名称空间中main
。
两者都是很好的匹配,并且编译器无法决定您要调用哪一个。因此,它会生成一个错误告诉您。
error:
然后gcc和clang都执行note:
s序列。通常,错误后的所有note:
s对理解错误都很重要。
要解决此问题,请尝试调用::min
(完全限定该调用),或将该函数重命名为其他名称,或者使您的版本比std::min
(更好,但在某些情况下可行)或调用更好的匹配(min)(a,b)
。最后一个阻止ADL / Koenig查找,还阻止宏扩展(例如,如果某些操作系统已将#define min
宏注入其系统头中)(通过@ 0x499602D2)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句