2016-11-13 3 views
1

Я пытаюсь реализовать манипулятор с одним целым аргументом. За исключением одной маленькой разницы, я думаю, что делаю именно то, что сказано в this guide и в this question. Единственное различие заключается в том, что мой оператор является членом вместо свободной функции.C++ манипуляторы с параметрами

Я поставлю здесь только соответствующие части моего кода. Некоторые операторы и другие внутренние процедуры будут опущены, чтобы код оставался чистым. Смотрите ниже:

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); 
} 

Компилятор возвращает сообщение об ошибке:

«не подходит для„оператора < <“(типы операндов„Display“и„Manip“)»

Может кто-нибудь сказать мне, что я делаю неправильно?

+0

вы можете заменить 'Display & оператор << (Manip & m);' на 'Display & оператор << (Const Manip & m);'. 'Position' возвращает xvalue и нет преобразования по умолчанию не в Lvalue. – Franck

+0

Да! Вы и Сэм Спасибо! – rrd

ответ

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

position(3) возвращает временный manip объект, здесь.

Ваш перегружен << оператор объявляется следующим образом:

Display& operator<<(manip& m); 

Только const ссылка может связываться с временным объектом. Ссылка не const не привязывается к временному объекту. Ваш оператор << должен иметь параметр const manip &, а не manip &.

Это не имеет никакого отношения к манипуляторам, у которых есть параметр. Манипулятор без параметра, который используется одинаково, также будет иметь такую ​​же проблему, если только он не объявлен как статический объект в глобальной области видимости (но в этом случае он также должен быть объектом const и будет иметь такую ​​же проблему).

+0

Это сработало. Спасибо! – rrd

 Смежные вопросы

  • Нет связанных вопросов^_^