我有这个声明
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)
都是合法的,因为函数指针在调用时会隐式取消引用。