带参数的 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
对象,并且将具有同样的问题。
我正在尝试使用一个整数参数实现一个操纵器。 除了一点点不同,我认为我完全按照 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
对象,并且将具有同样的问题。