我收到错误:调用重载'max(Cents&,Cents&)'是不明确的[重复]

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了我收到错误:调用重载'max(Cents&,Cents&)'是不明确的[重复]相关的知识,希望对你有一定的参考价值。

这个问题在这里已有答案:

1 ..我正在测试以下使用模板的代码 源代码源自此learncpp教程 https://www.learncpp.com/cpp-tutorial/132-function-template-instances/

#include <iostream>
#include <cstring>
#include <typeinfo>
using namespace std;

// ======================================================================
template <typename T>
const T& max(const T& x,const T& y)

  return (x>y)?x:y;


// ======================================================================
class Cents

private:
  int m_cents;
public:
  Cents(int cents):m_cents(cents)
  
  

  friend bool operator>(const Cents &c1,const Cents &c2)
  
    return (c1.m_cents>c2.m_cents);
  

  int get_val()
  
    m_cents;
  
;

// ======================================================================
int main()

  Cents nickle(5);
  Cents dime(10);

  Cents bigger=max(nickle,dime);
  // std::cout<<"bigger: "<<bigger.get_val()<<std::endl;
  // bigger: 1471225424

  return 0;

我得到了这个错误

error: call of overloaded ‘max(Cents&, Cents&)’ is ambiguous
   Cents bigger=max(nickle,dime);

代码有什么问题?

2 ..我怎么打印结果? 例如,我尝试了std::cout<<"bigger: "<<bigger<<std::endl; 但是我遇到了以下错误,该错误表示没有重载的运算符<<更大(Cent类型对象)

error: cannot bind ‘std::basic_ostream<char>’ lvalue to ‘std::basic_ostream<char>&&’
   std::cout<<"bigger: "<<bigger<<std::endl;
error: no match for ‘operator<<’ (operand types are ‘std::basic_ostream<char>’ and ‘Cents’)
   std::cout<<"bigger: "<<bigger<<std::endl;
答案

命名空间std还包含一个名为max的函数模板,它的签名与max函数模板基本相同。虽然你没有明确地包含正式定义std::max的头文件(<algorithm>),但是实现可能包含来自任何其他库头[res.on.headers]/1的任何库头,因此它是完全合法的(并且使用标准库的代码必须要处理在你的情况下,std::max最终会在命名空间std中声明。该

using namespace std;

然后,顶部的指令将std::max函数模板引入全局命名空间。因此,在此using指令之后的任何时候,非限定名称查找将在全局命名空间中找到两个具有相同签名的函数模板max,因此,您对max的调用将是不明确的(无法确定应调用哪个函数)他们都是同样有效的选择)。要解决这个问题,请删除using namespace std;(推荐)或通过限定名称明确识别max函数调用的目标,例如:

Cents bigger = ::max(nickle, dime);

以上是关于我收到错误:调用重载'max(Cents&,Cents&)'是不明确的[重复]的主要内容,如果未能解决你的问题,请参考以下文章

g ++错误:重载'abs(unsigned int)'的调用是不明确的

对重载函数错误的奇怪模棱两可的调用

运算符重载中没有运算符'=='匹配[重复]

参数标签'(stringInterpolationSegment :)'与任何可用的重载都不匹配

即使我重载了赋值,也没有可行的重载'='错误

我收到错误:使用 Kotlin 时,Apache Beam 中 MapElements 转换的“重载分辨率歧义”