我想这是一个非常荒谬/基本的问题,但仍然是:
class m
{
public:
void f(int ***);
/***/
}
void m::f(int ***a = NULL)
{
/***/
}
对f的调用(以及任何具有 all 参数的默认值的函数)不接受0参数。为什么?那我该如何格式化声明?
答案 0 :(得分:13)
如果函数定义在头文件中,则可以正常工作。规则是任何调用函数的人都必须“看到”默认值。
所以,我猜你在单独的源文件中有函数定义。假设是这种情况,只需将默认值放在函数声明中(在类中):
class m
{
public:
void f(int *** = 0);
/***/
};
您还需要从函数定义中删除默认值,因为您只能在一个地方定义默认值(即使值本身相同)。
答案 1 :(得分:2)
这将有效:
class m
{
public:
void f(int ***a = NULL);
};
void m::f(int ***a)
{
}
答案 2 :(得分:2)
C ++中的默认值是语法糖;编译器实际上是在调用点为您插入参数。这意味着编译器需要知道默认值是什么,因此它必须由函数声明提供。
这也意味着如果你有继承和虚方法,那么使用的默认值是静态类型(即编译器认为对象是什么类型),而不是运行时类型。例如:
class Base
{
public:
virtual ~Base() { }
virtual std::string foo(std::string s = "b") { return "Base:" + s; }
};
class Derived
: public Base
{
public:
virtual std::string foo(std::string s = "d") { return "Derived:" + s; }
};
int main(void)
{
Derived d;
Base& b = d;
std::cout << b.foo() << std::endl;
return 0;
}
将打印Derived:b
,而不是Derived:d
。