C++ 对象创建时构造函数调用不明确

C++ 对象创建时构造函数调用不明确,c++,constructor,C++,Constructor,我的计划如下: 当我编译时,我得到一个错误:-重载的-xxxint-调用是不明确的 我知道编译器发现这两个构造函数签名相等,因为我默认设置了一个参数“0” 有什么方法可以让编译器处理不同的签名,程序就能成功编译吗?您只需要一个构造函数 class xxx { public: explicit xxx(int v, int n=0) { cout << "default constructor called" << endl; } };

我的计划如下:

当我编译时,我得到一个错误:-重载的-xxxint-调用是不明确的

我知道编译器发现这两个构造函数签名相等,因为我默认设置了一个参数“0”


有什么方法可以让编译器处理不同的签名,程序就能成功编译吗?

您只需要一个构造函数

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

你只需要一个构造函数

class xxx
{
public:
    explicit xxx(int v, int n=0)
    {
       cout << "default constructor called" << endl;
    }
};
您有两种选择:

删除其中一个构造函数:

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中的代码都可以工作。选择权在你,主要取决于你的主观品味。

你有两个选择:

删除其中一个构造函数:

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中的代码都可以工作。选择权在你,主要是主观喜好。

你希望它调用哪一个,为什么?我能看到的唯一对你有效的方法是删除默认值n。请注意,您仍然可以将第二个标记为显式。xxxint v,int n=0不是默认构造函数。正在使用explicit关键字。我知道如何使它工作,只是想知道是否有任何方法可以以这种方式创建对象。您希望explicit关键字在这里完成什么?您希望它调用哪一个,为什么?我唯一能看到对您工作的是删除默认值n。请注意,您仍然可以将第二个标记为显式。xxxint v,int n=0不是默认构造函数。正在使用explicit关键字。我知道如何使它工作,只是想知道是否有任何方法以这种方式创建对象。你希望显式关键字在这里实现什么?当然,如果OP计划{10,20}工作,现在不会,但我会冒险。当然,如果OP计划{10,20}工作,现在不会,但是我有一个不同的地方:有一个不同的地方:用一个显式构造函数,你不能从一个初始化列表中隐式地转换,比如{1,2}。@ MikeSeymour:当然,但是在问号中没有C++ 11标签,但是有一个C++标签,C++ 11是当前的C++标准。但事实上大多数平台都缺少C++ 11的特性。事实上,支持所有或几乎所有的C++ 11。我已经使用了包括初始化列表在内的许多功能一年多了,我确信我不是唯一一个没有陷入过去的人。这有一个区别:只有一个显式构造函数,你不能从初始化列表(如{1,2})隐式转换。@MikeSeymour:当然,但问题中没有c++11标记否,但是有一个C++标签,C++ 11是当前的C++标准。@ MikEyMyO: JeJeor,但事实上大多数平台都缺少C++ 11的特性。事实上,支持所有或几乎所有的C++ 11。一年多来,我一直在使用包括初始化列表在内的许多功能,我相信我不是唯一一个不陷入过去的人。