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;
答案 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);