我收到错误消息:重载的“ max(Cents&,, Cents&)”的调用不明确

时间:2019-04-16 01:22:01

标签: c++ c++11 c++14

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;
但是我遇到了以下错误,该错误说没有更大的运算符<<对于更大的(中心类型对象)

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;

1 个答案:

答案 0 :(得分:2)

名称空间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);