模板函数调用歧义错误

析构函数

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

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

请帮我。

Yakk-亚当·内夫罗蒙特

这里有两件事。

您的第一个问题是您只包括了部分错误消息。这是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] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

歧义调用-模板化函数

来自分类Dev

模板编程:对重载函数的歧义调用

来自分类Dev

函数模板的部分排序-歧义调用

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

C ++模板和对重载函数的歧义调用

来自分类Dev

调用了错误的模板函数

来自分类Dev

调用重载的构造函数会产生歧义错误C ++

来自分类Dev

模板函数的歧义递归定义

来自分类Dev

可变参数模板函数中对重载函数的歧义调用

来自分类Dev

Ruby中的歧义函数调用

来自分类Dev

VS2013中使用可变参数模板时“对重载函数的歧义调用”

来自分类Dev

可变参数模板多继承函数调用上的歧义访问

来自分类Dev

在VS2013中使用可变参数模板时“对重载函数的歧义调用”

来自分类Dev

可变函数模板中的歧义

来自分类Dev

具有显式调用的C#构造函数歧义-错误CS0012

来自分类Dev

调用函数模板出现“无匹配函数”错误

来自分类Dev

调用函数中的歧义。隐式转换?

来自分类Dev

对重载整数构造函数的歧义调用

来自分类Dev

儿童类C ++中的歧义函数调用

来自分类Dev

对基类中的重载函数的歧义调用

来自分类Dev

构造函数调用中的歧义类型转换

来自分类Dev

模板类成员与非成员模板函数的歧义

来自分类Dev

使用模板编译错误-没有匹配的调用函数

来自分类Dev

C ++模板子类调用了错误的父构造函数

来自分类Dev

我的一段代码试图读取doc / docx文件。调用WordExtractor构造函数会产生歧义错误

来自分类Dev

从模板多次调用的函数

来自分类Dev

模板函数未调用

来自分类Dev

从模板调用组件函数

来自分类Dev

调用模板成员函数

Related 相关文章

热门标签

归档