以下行有错误Default argument is not allowed
。
public ref class SPlayerObj{
private:
void k(int s = 0){ //ERROR
}
}
为什么 C++ 没有托管类型的默认参数?
我想知道是否有办法解决这个问题。
以下行有错误Default argument is not allowed
。
public ref class SPlayerObj{
private:
void k(int s = 0){ //ERROR
}
}
为什么 C++ 没有托管类型的默认参数?
我想知道是否有办法解决这个问题。
它确实有可选参数,只是它们看起来与 C++ 语法不同。可选参数是语言互操作问题。它必须由进行调用的语言实现,它生成实际使用默认参数的代码。对于旨在简化互操作的语言(如 C++/CLI)来说,这是一个棘手的问题,您当然不知道要使用哪种语言进行调用。或者,如果它甚至具有可选参数的语法。例如,C# 语言直到版本 4 才出现。
如果该语言确实支持它,那么该编译器如何知道默认值是什么。值得注意的是,VB.NET 和 C# v4 选择了不同的策略,VB.NET 使用属性,C# 使用 modopt。
您可以在 C++/CLI 中使用 [DefaultParameterValue] 属性。但你不应该,结果是不可预测的。
除了Hans Passant 的准确答案,第二部分关于如何解决这个问题的答案之外,您还可以使用多个具有相同名称的方法来模拟默认参数情况。
public ref class SPlayerObj {
private:
void k(int s){ // Do something useful...
}
void k() { // Call the other with a default value
k(0);
}
}
另一种解决方案是使用[OptionalAttribute]
附带的Nullable<int>
类型化参数。如果调用者没有指定参数,它将是一个nullptr
.
void k([OptionalAttribute]Nullable<int>^ s)
{
if(s == nullptr)
{
// s was not provided
}
else if(s->HasValue)
{
// s was provided and has a value
int theValue = s->Value;
}
}
// call with no parameter
k();
// call with a parameter value
k(100);