Почему С++ CLI не имеет аргументов по умолчанию для управляемых типов?
Следующая строка имеет ошибку Default argument is not allowed
.
public ref class SPlayerObj{
private:
void k(int s = 0){ //ERROR
}
}
Почему С++ не имеет аргумента по умолчанию для управляемых типов?
Я хотел бы знать, есть ли способ исправить это.
Ответы
Ответ 1
У него есть необязательные аргументы, они просто не выглядят так же, как синтаксис С++. Необязательные аргументы - проблема взаимодействия между языками. Он должен быть реализован языком, который делает вызов, и генерирует код, который фактически использует аргумент по умолчанию. Какая сложная проблема на языке, который был разработан для упрощения взаимодействия, например с С++/CLI, вы, конечно, не знаете, на каком языке будет звонить. Или, если у него даже есть синтаксис для необязательных аргументов. Язык С# не делал до версии 4, например.
И если язык поддерживает его, как этот компилятор знает, что такое значение по умолчанию. Примечательно, что VB.NET и С# v4 выбрали разные стратегии, VB.NET использует атрибут, С# использует modopt.
Вы можете использовать атрибут [DefaultParameterValue] в С++/CLI. Но вы не должны, результат не предсказуем.
Ответ 2
Помимо точного ответа от 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);
}
}
Ответ 3
Альтернативным решением является использование параметра [OptionalAttribute]
вдоль стороны a 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);