我意识到这不一定是你想要做的事情,但是前几天我遇到了类似的代码。所以,我想更多地研究一下这个想法......
我有一个重载了构造函数和仿函数的类。这按预期工作。但是,当你使用默认构造函数调用一个类然后尝试使用该仿函数时,它会失败(因为它无法弄清楚如何将类转换为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;
}
答案 0 :(得分:8)
令人惊讶的是,
foo otherfoo();
声明一个函数而不是一个对象。有关讨论,请参阅C++ Gotchas (Gotcha #19: Function/Object Ambiguity)。
要修复,请将该行更改为
foo otherfoo;
或者,在C ++ 11中,
foo otherfoo{};
答案 1 :(得分:0)
函数声明和对象定义之间存在着一种矛盾。它们具有相同的语法。因此决定将此语法视为函数声明。因此在本声明中
foo otherfoo();
有一个函数声明,返回类型为foo,不接受参数。
要使用默认构造函数定义类的对象,同时对其成员进行零初始化,可以使用以下语法
foo otherfoo {};