我收到错误:调用重载'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)'的调用是不明确的