2

私のプログラムは次のとおりです。

class xxx{
       public: explicit xxx(int v){cout<<"explicit constructor called"<<endl;}
               xxx(int v,int n=0){cout<<"default constructor called"<<endl;}
  };
  int main(int argc, char *argv[])
  {
   xxx x1(20);    //should call the explicit constructor
   xxx x2(10,20); //should call the constructor with two variables
   return 0;
  }

コンパイルするとエラーが発生します:- 「オーバーロードされた âxxx(int)â の呼び出しがあいまいです」

デフォルトで引数を「0」にしたため、コンパイラーは両方のコンストラクターの署名が等しいと判断することを知っています。

コンパイラが署名を異なる方法で処理でき、プログラムが正常にコンパイルされる方法はありますか?

4

2 に答える 2

2

次の 2 つの選択肢があります。

コンストラクターの 1 つを削除します。

class xxx
{
public:
    explicit xxx(int v, int n = 0); // don't forget explicit here
};

デフォルトのパラメーターを削除します。

class xxx
{
public:
    explicit xxx(int v);
    xxx(int v,int n);
};

どちらの方法でも、コードmain()は機能します。選択はあなた次第です (ほとんどは主観的な好みの問題です)。

于 2013-08-21T11:32:42.753 に答える