带参数的C ++操纵器

时间:2016-11-13 16:27:22

标签: c++ manipulators

我正在尝试用一个整数参数实现一个操纵器。 除了一点点差异之外,我认为我正在完成this guidethis 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);
}

编译器返回此错误消息:

  

“不匹配'运算符&lt;&lt;' (操作数类型是'显示'和'操纵')“

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

1 个答案:

答案 0 :(得分:0)

import serial
import time
import csv
ser = serial.Serial('COM29', 57600)

timeout = time.time() + 60/6   # 5 minutes from now

result = []
while True:
    test = 0
    if test == 5 or time.time() > timeout:
        break
    ss=ser.readline()
    print(ss)
    s=ss.replace("\n","")
    result.append(s)
    time.sleep(0.02)

with open('C:\Users\Ivory Power\Desktop\EEG_Data\Othr_eeg\egg31.csv', 'w') as csvfile:
    spamwriter = csv.writer(csvfile,delimiter=',', lineterminator='\n')
    spamwriter.writerow([result])
    csvfile.close()

disp << position(3) << "some string here"; 会返回一个临时的position(3)对象。

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

<<

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

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