13

我不熟悉模板。我刚刚开始学习它。为什么我在以下程序中出现错误?

#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>]

请帮我。

4

2 回答 2

16

这里有两件事。

您的第一个问题是您只包含了错误消息的一部分。 这是 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模板类的实例namespace std,函数模板std::min是通过称为“参数相关查找”或“Koenig 查找”的过程找到的。(函数重载候选在本地搜索,也在函数参数的命名空间中,在函数参数的模板参数的命名空间中,以及在由参数指向的事物的命名空间中功能等)

还可以找到您的本地函数min,因为它与main.

两者都是同样好的匹配,编译器无法决定你想调用哪一个。所以它会产生一个错误告诉你这个。

然后gcc 和 clang 都会执行error:一系列note:s。通常,错误后的所有note:s 对于理解错误都很重要。

要解决此问题,请尝试调用::min(完全限定调用),或将函数重命名为其他名称,或使您的版本比std::min(棘手,但在某些情况下可行)更好的匹配,或调用(min)(a,b). 最后一个阻止 ADL/Koenig 查找,也阻止宏扩展(例如,如果某些操作系统已将#define min宏注入其系统头文件)(通过@0x499602D2)。

于 2015-05-15T17:14:47.920 回答
5

您正在与std::min. 它可能包含在您包含的其他标准库标头之一中,要么 要么<iostream><string>我的猜测可能是后者。快速解决方法是重命名您的函数。例如,将其重命名为mymin可以正常工作。演示

于 2015-05-15T17:14:08.047 回答