1

我有这个声明

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 号会成功?

4

2 回答 2

5

这是预期的行为。zp是一个指针 (a Z *),并且operator()Z,而不是重载Z *。当你用 来尊重指针时*zp,你会得到一个Z &,因为它operator() 重载的。

不幸的是,您不能为指针类型重载运算符(我认为这与指针不是用户定义类型的事实有关,但我面前没有标准)。您可以使用引用简化语法:

Z & r = *zp;
r(3);
于 2011-12-22T04:33:42.260 回答
0

如果您的Z类型没有状态,您可以将其更改为函数。

typedef void Y(int);
void y( int a ) {
  cout << "y() " << a << endl;
}

Y& oy = y;
Y* yp = &oy;

现在oy(1)yp(1)都是合法的,因为函数指针在调用时会隐式取消引用。

于 2011-12-22T04:54:47.390 回答