2016-11-13 57 views
1

我試圖用一個整數參數實現一個操縱器。 除了一個小小的差異,我認爲我正在做的是​​和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); 
} 

編譯器將返回此錯誤消息:

「敵不過‘運營商< <’(操作數類型是‘顯示’和‘MANIP’)」

誰能告訴我什麼我做錯了嗎?

+0

你可以用'Display&operator <<替代'Display&operator <<(const & m);'。''position''返回一個xvalue,並且沒有默認轉換成一個左值 – Franck

+0

是啊!你和Sam是對,謝謝! – rrd

回答

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

position(3)返回臨時manip對象,在這裏。

你重載<<操作聲明如下:

Display& operator<<(manip& m); 

只有const參考可以綁定到一個臨時對象。非const引用不會綁定到臨時對象。您的<<運營商應該有const manip &參數,而不是manip &

這與有參數的操縱器無關。沒有使用相同方法的參數的操縱器也會有同樣的問題,除非它在全局範圍內聲明爲靜態對象(但在這種情況下,它也應該是const對象,並且也會有同樣的問題) )。

+0

工作得很好,謝謝! – rrd