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

你只需要一个构造函数

class xxx
{
public:
    explicit xxx(int v, int n=0)
    {
       cout << "default constructor called" << endl;
    }
};

然后你可以初始化 XXX 对象:

xxx x1(20);    //should call the explicit constructor
xxx x2(10,20); //should call the construct
于 2013-08-21T11:31:33.700 回答
2

您有 2 个选择:

删除其中一个构造函数:

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 回答