C++ 为什么我不能在c+;中一次初始化3个默认参数+;

C++ 为什么我不能在c+;中一次初始化3个默认参数+;,c++,c++11,visual-c++-2012,C++,C++11,Visual C++ 2012,上面的代码运行良好,但当我尝试使用3个默认参数时 class Complex { private: float rp, ip; //const int a=10; //static int b; //static const int c = 50; public: Complex(); //Complex(float ); /*Complex(float,float);*/ Complex(float , float = 20, float = 30); } 我得到以下错误- main.

上面的代码运行良好,但当我尝试使用3个默认参数时

class Complex 
{
private:

float rp, ip;
//const int a=10;
//static int b;
//static const int c = 50;
public:
Complex();
//Complex(float );
/*Complex(float,float);*/
Complex(float , float = 20, float = 30);
} 
我得到以下错误-

main.cpp(12):错误C2668:“Complex::Complex”:对
重载函数 complex.h(15):可以是'complex::complex(float,float,float)' complex.h(12):或'complex::complex(void)'


具有三个默认参数的构造函数与无参数构造函数冲突

构造器模棱两可。如果您构造没有参数的
Complex
,编译器无法理解您要调用的构造函数:它是否是默认构造函数

class Complex
{
private:
float rp, ip;
//const int a=10;//static int b;//static const int c = 50;
public:
Complex();
//Complex(float );
/*Complex(float,float);*/
Complex(float =10  , float = 20, float = 30);
} 
或三个参数均为默认值的构造函数:

Complex();
如果您这样做,这两个构造函数都会匹配

Complex(float =10  , float = 20, float = 30);


错误消息非常清楚地说明了这一点

问题是,因为所有3个参数都是默认参数,编译器不知道如何推断您所说的函数重载

new Complex();

这会失败,因为编译器无法知道您在编写时所指的两个不同函数中的哪一个

// default constructor, or 3 defaulted floats?
Complex a;
那叫什么

Complex c;

使用三个默认值


您可以通过删除
Complex()
构造函数来解决这个问题,并让
Complex(float,float,float)
构造函数使用三个默认值来处理默认构造。

您是否阅读了错误消息,或者只是假设它不可理解?错误消息似乎非常清楚。当你调用一个没有参数的构造函数时,编译器无法决定你指的是这两个构造函数中的哪一个。这与第一个参数初始化有什么关系呢@本杰明:当我尝试初始化第一个参数时,为什么它不编译。我无法从这个错误消息中得到答案
Complex c;
Complex();
Complex(float,float,float);