我的职能签名:
JSONValue get(string data, ref int parentCounter)
第二个参数必须通过引用传递并且是可选的。我的非工作变体:
JSONValue get(string data, ref int parentCounter = 10);
JSONValue get(string data, ref int parentCounter = int(10));
JSONValue get(string data, ref int parentCounter = new int(10));
JSONValue get(string data); // override also does not work
DMD32 D编译器v2.065
答案 0 :(得分:3)
由于参数为ref
,因此必须有一个地址。因此,它必须是左值表达式。
你可以这样做:
JSONValue get(string data, ref int parentCounter = *new int);
您目前无法使用此语法为新分配的int
提供值。但是,在D 2.066中,您将能够写下:
JSONValue get(string data, ref int parentCounter = *new int(10));
这将在堆上分配新的int
,除非在调用者站点指定了一个。{/ p>
您还可以使用静态变量或ref函数调用:
int defaultValue;
ref int defaultValueFun()
{
auto i = new int;
*i = 10;
return *i;
}
JSONValue get(string data, ref int parentCounter = defaultValue);
// or
JSONValue get(string data, ref int parentCounter = defaultValueFun());
如果在defaultValue
的引用仍然在使用时可能会调用value
,请注意此技术。
答案 1 :(得分:1)
此时最简单的解决方案可能只是重载功能。 e.g。
JSONValue get(string data)
{
int dummy = 10;
return get(data, dummy);
}
JSONValue get(string data, ref int parantCounter)
{
...
}
它还避免了任何不必要的堆分配,不像cybershadow's suggestion of using *new int(10)
2.066一样(虽然能够做*new int(10)
肯定会很酷)。
现在,您似乎在问题中指出由于某种原因,重载函数不起作用:
JSONValue get(string data); // override also does not work
所以,也许这个解决方案不适合你,但没有更多的信息,我不知道为什么它不会。当然,如果你正在处理自由函数,它会,如果你正在处理结构成员函数,它会。我能想到的唯一可能的问题是,如果你要覆盖基类函数,但即便如此,我能想到的唯一问题是基类是否声明了
JSONValue get(string data, ref int parentCounter)
并且你试图通过基类而不是派生类调用该函数,如果你这样做,那么在重写函数中使用默认参数无论如何都不会帮助你,因为基类没有声明一个 - 默认参数只有在通过派生类使用时才有效。当然,您可以覆盖基类'get
,然后在派生类中添加一个看起来像
JSONValue get(string data)
因此,如果宣布这样的过载对您不起作用,我将需要更多详细信息,以帮助您找出它无法正常工作的原因。