我有一个自定义输出类,它有两个std::ostream
用于不同目的的成员。根据输出类的配置方式使用任一流。在某些情况下,两个流被链接在一起。下面是该类的一个非常简化的版本。如果需要,我可以提供更多细节。
class c_Output
{
public:
c_Output (bool x_useA) : m_useA(x_useA) { /* setup m_stream[AB] here */ };
~c_Output ();
inline std::ostream& stream () { return (m_useA ? m_streamA : m_streamB); };
private:
bool m_useA;
std::ostream m_streamA;
std::ostream m_streamB;
}
我知道如何为我希望流向/从std::cout
、 std::cin
或任何其他类的类编写流运算符std::iostream
,但我正在努力编写流运算符,其中一个c_Output
实例用作 lhs 而不是std::ostream
实例。
现在,我能够逃脱:
c_Output l_output;
uint64_t l_value = 0xc001c0de;
l_output.stream() << std::hex << std::setw(16) << std::setfill('0') << l_value;
c_Output::stream()
返回适当的std::ostream&
,因此其行为与预期的一样。
我想将上面的内容重写为:
c_Output l_output;
uint64_t l_value = 0xc001c0de;
l_output << std::hex << std::setw(16) << std::setfill('0') << l_value;
根据我在 StackOverflow 和更大的网络上看到的示例,我尝试了几种不同版本的定义operator<<
,但无济于事。最新版本如下所示:
// in header
class c_Output
{
...
friend c_Output& operator<< (c_Output& x_output, std::ostream& x_stream);
...
}
// in source
c_Output&
operator<< (c_Output& x_output, std::ostream& x_stream)
{
x_output.stream() << x_stream;
return x_output;
}
参数的设置旨在反映标准流运算符重载。此设置给了我编译问题,例如:
error: no match for 'operator<<' in 'l_output << std::hex'
note: candidates are: c_Output& operator<<(c_Output&, std::ostream&)
我已经剥离了所有文件和行信息,但它明白了这一点。我显然得到了运算符 rhs 的类型不正确。根据需要实现流运算符的正确类型和/或正确方法是什么?
还有一个c_Input
具有类似要求的补充类,但调整答案c_Output
应该是微不足道的。