简而言之,这是界面
#include <iostream>
struct Graph
{
typedef int Parameter;
struct Render
{
void to (std :: ostream &) {}
};
Render render (Parameter) {}
};
std :: ostream &
operator << (std :: ostream &, Graph :: Render &);
int main ()
{
Graph () .render (0) .to (std :: cout);
// std :: cout << Graph () .render (0);
}
除非您取消注释最后一行,否则上述内容将无需投诉进行编译。
为什么全局operator<<
不能编译?
答案 0 :(得分:8)
您的运算符仅为可变左值重载,因此prvalue(Graph().render(0)
的临时值)不会绑定它。
您可以更改运算符重载以使用const引用(它将接受左值和 rvalues):
std::ostream & operator<<(std::ostream &, const Graph::Render &);
// ^^^^^^^^^^^^^^^^^^^^^
或者您可以添加额外的右值超载:
std::ostream & operator<<(std::ostream &, Graph::Render &&);
// ^^^^^^^^^^^^^^^^
如果有疑问,请使用第一个解决方案。如果打印对象的字符串表示需要其变异,那将是非常令人惊讶的。
(Graph::render
按值返回新的Render
对象也有点奇怪,但这是你的决定。)