![](/img/trans.png)
[英]Overloading operator<<(ostream&, T) where T is “enum class MyEnum”
[英]Ostream& operator<< overloading code not working
#include <string>
#include <iostream>
template <typename T>
T max(T a, T b) {
return a > b ? a : b;
}
class Dummy {
private:
std::string name;
int age;
public:
Dummy(int an_age) {age = an_age;}
bool operator> (Dummy &a) {return age > a.age;}
std::string toString() const {return "The age is " + age;}
};
std::ostream& operator<<(std::ostream& out, const Dummy& d) {return out<< d.toString();}
int main()
{
std::cout << max(3, 7) << std::endl;
std::cout << max(3.0, 7.0) << std::endl;
std::cout << max<int>(3, 7.0) << std::endl;
std::cout << max("hello", "hi") << std::endl;
Dummy d1(10);
Dummy d2(20);
std::cout << max(&d1, &d2) << std::endl;
return 0;
}
我对C ++相当陌生,但对编程却并不陌生。 我编写了代码,以在C ++中处理模板和运算符重载。
花了相当长的时间才能使其编译并部分工作。
ostream运算符<<不能正常工作,仅返回对象的地址。 我不知道原因。
我设法通过盲目的反复试验来编译它,因此我怀疑代码可能在某种程度上被破坏了。 而且我可能不知道有什么需要改进的地方。
您的max(&d1,&d2)
表达式为您提供地址 ,并打印出来。 您的操作员重载很好。
我想你在说的是
std::cout << max(&d1, &d2) << std::endl;
问题是您传递的是Dummy *
而不是Dummy
。 这使得max
return Dummy *
,并且由于您重载的operator<<
(基本上)采用了Dummy
,因此不会调用它。 如果您尝试通过引用传递,则不需要在调用方进行任何特殊的操作,只需使该函数获得引用,编译器便会找出该引用。
不要写自己的max
,而是使用标准的max
:
#include <algorithm> void f() { int a = std::max(8, 4); }
唯一的区别是,标准max
默认情况下使用operator <
,就像标准库中的所有其他内容一样。
您的toString
函数所做的事情与您认为的有所不同。 而是返回从字符编号age
开始的"The age is "
子字符串。 例如,如果age
为3,则toString
将返回" age is "
。 要将整数转换为字符串,您必须使用ostringstream
:
std::string toString() const { std::ostringstream s; s << "The age is " << age; return s.str(); }
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.