带参数的 C++ 操纵器

C++ manipulators with parameters

我正在尝试使用一个整数参数实现一个操纵器。 除了一点点不同,我认为我完全按照 this guide and in this question 中的说明进行操作。唯一的区别是我的运算符是成员而不是自由函数。

我将把代码的相关部分放在这里。一些运算符和其他内部例程将被省略以保持代码干净。见下文:

main.cpp

#include "Display.h"

int main()
{
    Display disp;
    disp << position(3) << "some string here";
    // ...
}

Display.h

struct manip
{
    Display& (*_f)(Display&, int);
    int _i;
    manip(Display& (*f)(Display&, int), int i) : _f(f), _i(i) {}
};

manip position(int pos);

class Display 
{
private:
    int _cursor = 0;
    void cursorPosition(int pos);
public:
    Display& operator<<(manip& m);
    friend Display& setPosition(Display& disp, int pos);
};

Display.cpp

#include "Display.h"

Display& setPosition(Display& disp, int pos)
{
    disp.cursorPosition(pos);
    return disp;    
}

manip position(int pos)
{
    return manip(setPosition, pos);
}

Display& Display::operator<<(manip& m)
{
    return m._f(*this, m._i);
}

编译器返回此错误消息:

"no match for 'operator<<' (operand types are 'Display' and 'manip')"

谁能告诉我我做错了什么?

 disp << position(3) << "some string here";

position(3) returns 临时 manip 对象,这里。

您的重载 << 运算符声明如下:

 Display& operator<<(manip& m);

只有 const 引用可以绑定到临时对象。非 const 引用不会绑定到临时对象。您的 << 运算符应该有一个 const manip & 参数,而不是 manip &.

这与有参数的操纵器无关。没有以相同方式使用参数的操纵器也会有同样的问题,除非它被声明为全局范围内的静态对象(但是,在那种情况下,它也应该是一个 const 对象,并且将具有同样的问题。