我正在实现一个类,我想使用<<。
将一些参数传递给实例。例如,
terminal term;
term << "Hello World!" << '\n';
代码如下,
class terminal {
template <typename T>
terminal& operator << (T& t) {
std::cout << t;
return *this;
}
};
基本上,我想成为一个流而不是流的一部分。 (不是cout&lt;&lt; term;)
(抱歉,我忘了指明我的问题) 问题是,它适用于字符串,但如果有一个数字(如int,char等),它编译失败。
如果我们使用上面的例子,编译器会抱怨
二进制表达式的操作数无效(&#39;终端&#39;和&#39; int&#39;)
答案 0 :(得分:2)
我会更改为以下内容,以便对operator<<
(例如term << "hello" << 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;
}
}
答案 1 :(得分:1)
问题是你的operator <<
通过引用非const来获取它的参数,这意味着它只能绑定到左值。所以像非字符串文字这样的东西就出来了。如果您不需要修改参数,请改为const &
。该语言有一个特殊规则,允许对const
的左值引用也绑定到右值。
terminal& operator << (const T& t) {
std::cout << t;
return *this;
}
如果你做需要修改参数,请使用与<<
不同的方法。类似于流的界面会在<<
期间修改流式参数,这将是非常违反直觉和维护的噩梦。