3

我有两个像这样重载的构造函数,问题是输入了错误的构造函数重载:

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

它使用第二个构造函数,因为"desc"is aconst char*可以bool隐式转换为 a,所以这就是编译器所做的。没有从const char*to的隐式转换std::string,所以第一个构造函数在这里甚至不是候选对象。

要使用第一个构造函数,您需要显式传入 a string

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

编译器更喜欢将字符串文字 , 的类型转换"desc"为 a const char*,然后再转换为 a bool,而不是调用 的转换构造函数std::string。您可以通过执行以下操作确保调用第一个构造函数:

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