1

我正在尝试用一个整数参数实现一个操纵器。除了一点点不同,我认为我所做的正是本指南这个问题中所说的。唯一的区别是我的操作员是一个成员而不是一个自由函数。

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

主文件

#include "Display.h"

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

显示.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);
};

显示.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);
}

编译器返回此错误消息:

“'operator<<' 不匹配(操作数类型为 'Display' 和 'manip')”

有人可以告诉我我做错了什么吗?

4

1 回答 1

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

position(3)在这里返回一个临时manip对象。

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

 Display& operator<<(manip& m);

只有const引用才能绑定到临时对象。非const引用不会绑定到临时对象。您的<<操作员应该有一个const manip &参数,而不是manip &.

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

于 2016-11-13T16:35:58.403 回答