繁体   English   中英

Ostream&运算符<<重载代码不起作用

[英]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 ++中处理模板和运算符重载。

花了相当长的时间才能使其编译并部分工作。

  1. ostream运算符<<不能正常工作,仅返回对象的地址。 我不知道原因。

  2. 我设法通过盲目的反复试验来编译它,因此我怀疑代码可能在某种程度上被破坏了。 而且我可能不知道有什么需要改进的地方。

您的max(&d1,&d2)表达式为您提供地址 ,并打印出来。 您的操作员重载很好。

我想你在说的是

std::cout << max(&d1, &d2) << std::endl;

问题是您传递的是Dummy *而不是Dummy 这使得max return Dummy * ,并且由于您重载的operator<< (基本上)采用了Dummy ,因此不会调用它。 如果您尝试通过引用传递,则不需要在调用方进行任何特殊的操作,只需使该函数获得引用,编译器便会找出该引用。

  1. 不要写自己的max ,而是使用标准的max

     #include <algorithm> void f() { int a = std::max(8, 4); } 

    唯一的区别是,标准max默认情况下使用operator < ,就像标准库中的所有其他内容一样。

  2. 您的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM