模板函数调用歧义错误

时间:2015-05-15 17:04:49

标签: 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";
    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>]

请帮帮我。

2 个答案:

答案 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::stringnamespace 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