【问题标题】:How to overload operator << to act like what ostream does如何重载运算符 << 以像 ostream 一样操作
【发布时间】:2016-05-23 07:31:49
【问题描述】:

我正在实现一个类,我想使用 将一些参数传递给实例

例如,

terminal term;
term << "Hello World!" << '\n';

代码如下,

class terminal {
    template <typename T>
    terminal& operator << (T& t) {
        std::cout << t;
        return *this;
    }
};

基本上,我想成为流而不是流的一部分。 (不是 cout

(对不起,我忘了说明我的问题) 问题是,它适用于字符串,但如果有数字(如 int、char 等)则编译失败。

如果我们使用上面的例子,编译器会报错

二进制表达式的无效操作数('terminal' 和 'int')

【问题讨论】:

  • 你的代码有什么问题?
  • T&amp; t 设置为const T&amp;,您应该已经准备好了。
  • 您也可以发布产生错误的代码吗?
  • stackoverflow.com/questions/4366904/…此链接可能会解决您的问题。
  • @n.m.谢谢!你刚刚解决了我的问题!它必须是 const T&。

标签: c++ operator-overloading


【解决方案1】:

为了使operator&lt;&lt;(例如term &lt;&lt; "hello" &lt;&lt; std::endl;)的排序起作用,我将更改为以下内容:

namespace foo {

class terminal {    
  std::ostream &strm;
public:
  terminal(std::ostream &strm_) : strm(strm_) {}
  terminal() : strm(std::cout) {}

  template <typename T>
  friend std::ostream& operator<<(terminal &term, T const &t);
};

template <typename T>
std::ostream& operator<<(terminal &term, T const &t) {
  term.strm << t;
  return term.strm;
}

}

Live Demo

【讨论】:

  • 谢谢。这个实现考虑了 ostream,比我的好。
【解决方案2】:

问题是您的operator &lt;&lt; 通过引用非常量来获取其参数,这意味着它只能绑定到左值。所以像非字符串文字这样的东西已经出来了。如果您不需要修改参数,请改为使用const &amp;。该语言有一个特殊规则,允许对const 的左值引用也绑定到右值。

terminal& operator << (const T& t) {
    std::cout << t;
    return *this;
}

如果您确实需要修改参数,请使用与&lt;&lt; 不同的方法。在&lt;&lt; 期间修改流式参数的类流式接口将是极其违反直觉和维护的噩梦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-10-10
    • 2011-12-17
    • 2010-10-03
    • 1970-01-01
    相关资源
    最近更新 更多