3

このようにオーバーロードされた2つのコンストラクターがあります。問題は、間違ったコンストラクターのオーバーロードが入力されていることです:

class Param
{ 
    Param(
     const std::string& name,
     const MyVariant& variant = MyVariant()
     const std::string& desc = std::string(""),
     bool b1 = true,
     bool b2 = true )
     :
     mName(name),
     mValue(variant),
     mDesc(desc),
     mB1(b1),
     mB2(b2) {}

     Param( 
      const std::string& name,
      const MyVariant& variant,
      bool b1)
      :
      mName(name),
      mValue(variant)
      mB1(b1) {}

   private:
      std::string mName;
      MyVariant mValue;
      std::string mDesc;
      bool mB1;
      bool mB2;
};

 Param p("name",4,"desc"); // this enters the second constructor, not the first why ? 
4

2 に答える 2

4

2 番目のコンストラクターを使用するのは"desc"、暗黙的にconst char*に変換できるため、コンパイラーが行うことです。からへboolの暗黙的な変換はないため、最初のコンストラクターはここでは候補にもなりません。const char*std::string

最初のコンストラクターを使用するには、次のように明示的に渡す必要がありますstring

Param p("name",4,std::string("desc"));
于 2013-01-17T12:58:22.417 に答える
0

コンパイラは、 の変換コンストラクターを呼び出すよりも、文字列リテラル の型"desc"を aに変換const char*してからa に変換することを優先します。これを行うことで、最初のコンストラクターが呼び出されることを確認できます。boolstd::string

Param p("name",4,std::string("desc"));
于 2013-01-17T13:00:10.730 に答える