我意识到这不一定是你想要做的事情,但是前几天我遇到了类似的代码.所以,我想更多地研究一下这个想法......
我有一个重载了构造函数和仿函数的类.这按预期工作.但是,当你使用默认构造函数调用一个类然后尝试使用该仿函数时,它会失败(因为它无法弄清楚如何将类转换为int,这不是我想要的,无论如何.)这样做的正确方法是什么?
#include <cstdio>
class foo
{
public:
foo(int a, int b);
foo();
int operator()();
private:
int result;
};
foo::foo(int a, int b)
{
printf("I am a foo(int, int). a: %d b: %d\n", a, b);
result = a + b;
}
foo::foo()
{
printf("I am a base foo!\n");
result = -1;
}
int foo::operator()()
{
return result;
}
int main(void)
{
int ret1 = -12345;
int ret2 = -12345;
foo myfoo(3, 8);
foo otherfoo();
ret1 = myfoo();
ret2 = otherfoo(); //fails. Also, otherfoo()() fails.
printf("foo: %d otherfoo: %d\n", ret1, ret2);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
令人惊讶的是
foo otherfoo();
Run Code Online (Sandbox Code Playgroud)
声明一个函数而不是一个对象.有关讨论,请参阅C++ Gotchas(问题#19:函数/对象歧义).
要修复,请将该行更改为
foo otherfoo;
Run Code Online (Sandbox Code Playgroud)
或者,在C++ 11中,到
foo otherfoo{};
Run Code Online (Sandbox Code Playgroud)