使用默认参数重载构造函数

时间:2013-01-17 12:55:29

标签: c++

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

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 ? 

2 个答案:

答案 0 :(得分:4)

它使用第二个构造函数,因为"desc"const char*,可以隐式转换为bool,这就是编译器的作用。没有从const char*std::string的隐式转换,因此第一个构造函数甚至不是候选者。

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

Param p("name",4,std::string("desc"));

答案 1 :(得分:0)

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

Param p("name",4,std::string("desc"));