我有这个声明
struct Z {
void operator ()( int a ) {
cout << "operator()() " << a << endl;
}
};
Z oz, *zp = &oz;
oz(1); //ok
(*zp)(2); //ok
zp(3); //"error: 'zp' cannot be used as a function"
有没有办法修改结构声明,所以调用 3 号会成功?
我有这个声明
struct Z {
void operator ()( int a ) {
cout << "operator()() " << a << endl;
}
};
Z oz, *zp = &oz;
oz(1); //ok
(*zp)(2); //ok
zp(3); //"error: 'zp' cannot be used as a function"
有没有办法修改结构声明,所以调用 3 号会成功?
这是预期的行为。zp是一个指针 (a Z *),并且operator()为Z,而不是重载Z *。当你用 来尊重指针时*zp,你会得到一个Z &,因为它operator() 是重载的。
不幸的是,您不能为指针类型重载运算符(我认为这与指针不是用户定义类型的事实有关,但我面前没有标准)。您可以使用引用简化语法:
Z & r = *zp;
r(3);
如果您的Z类型没有状态,您可以将其更改为函数。
typedef void Y(int);
void y( int a ) {
cout << "y() " << a << endl;
}
Y& oy = y;
Y* yp = &oy;
现在oy(1)和yp(1)都是合法的,因为函数指针在调用时会隐式取消引用。