23

次の行にはエラーがありますDefault argument is not allowed

public ref class SPlayerObj{
private:

    void k(int s = 0){ //ERROR
    }
}

なぜC++にはマネージ型にデフォルトの引数がないのですか?
これを修正する方法があるかどうか知りたいのですが。

4

3 に答える 3

18

オプションの引数がありますが、C++ 構文と同じようには見えません。オプションの引数は、言語の相互運用の問題です。呼び出しを行う言語で実装する必要があり、デフォルト引数を実際に使用するコードを生成します。C++/CLI のように、相互運用を容易にするように設計された言語では、これはトリッキーな問題です。もちろん、どの言語が呼び出しを行うのかはわかりません。または、オプションの引数の構文さえある場合。たとえば、C# 言語はバージョン 4 までありませんでした。

そして、言語がそれをサポートしている場合、そのコンパイラはデフォルト値が何であるかをどのように知っていますか. 注目すべきは、VB.NET と C# v4 が異なる戦略を選択したことです。VB.NET は属性を使用し、C# は modopt を使用します。

C++/CLI で [DefaultParameterValue] 属性を使用できます。しかし、そうすべきではありません。結果は予測できません。

于 2013-03-16T23:03:10.343 に答える
12

Hans Passant からの正確な回答、これを修正する方法に関する第 2 部への回答に加えて、同じ名前の複数のメソッドを使用して、デフォルトの引数ケースをシミュレートできます。

public ref class SPlayerObj {
  private:
    void k(int s){ // Do something useful...
    }
    void k() { // Call the other with a default value 
       k(0);
    }
}
于 2015-01-07T10:38:59.960 に答える