C++ 不明确的重载构造函数:C++;

C++ 不明确的重载构造函数:C++;,c++,matrix,constructor,default-constructor,C++,Matrix,Constructor,Default Constructor,我正在完成一项与矩阵乘法有关的作业。我们得到了一些我填好的骨架文件;但是,我正在处理一个模棱两可的构造函数错误,并且构造函数必须保持其评分方式不变: test.cpp:6:7错误:重载“Mat4()”的调用不明确 在我的测试代码中,我想要 Mat4 I; // to result in a call to SetIdentity() via the default constructor I.Print( "I = " ); // should print the Identity Matrix

我正在完成一项与矩阵乘法有关的作业。我们得到了一些我填好的骨架文件;但是,我正在处理一个模棱两可的构造函数错误,并且构造函数必须保持其评分方式不变:

test.cpp:6:7错误:重载“Mat4()”的调用不明确

在我的测试代码中,我想要

Mat4 I; // to result in a call to SetIdentity() via the default constructor
I.Print( "I = " ); // should print the Identity Matrix for a 4x4
相关Mat4.h代码:

class Mat4{
protected:
    float   m[4][4];

public:
    // ** 3A: **
Mat4( );
Mat4( float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0, float=0 );
以及我的Mat4.cpp代码:

Mat4::Mat4( ){
SetIdentity( );
}

Mat4::Mat4( float a, float b, float c, float d, float e, float f, float g, float h,   float i, float j, float k, float l, float n, float o, float p, float q){
m[0][0] = a;
m[0][1] = b;
m[0][2] = c;
m[0][3] = d;
m[1][0] = e;
m[1][1] = f;
m[1][2] = g;
m[1][3] = h;
m[2][0] = i;
m[2][1] = j;
m[2][2] = k;
m[2][3] = l;
m[3][0] = n;
m[3][1] = o;
m[3][2] = p;
m[3][3] = q;
}
非默认构造函数的一个示例使用:

Mat4
Mat4::operator*( Mat4& that ){
// "this" is a pointer to this class's mat4  (this->name)
// "that" is a reference to the other matrix (that.name)

Mat4 result(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
int i, j, k;
for(i = 0; i < 4; i++){
    for(j = 0; j < 4; j++){
        for(k = 0; k < 4; k++){
            result.m[i][j] += (float)(this->m[i][k]*that.m[k][j]);
        }
    }
}
return result;
}
Mat4
Mat4::operator*(Mat4&that){
//“this”是指向该类的mat4的指针(this->name)
//“that”是对另一个矩阵(that.name)的引用
Mat4结果(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0);
int i,j,k;
对于(i=0;i<4;i++){
对于(j=0;j<4;j++){
对于(k=0;k<4;k++){
result.m[i][j]+=(float)(this->m[i][k]*that.m[k][j]);
}
}
}
返回结果;
}

谢谢你的帮助

编译器根本无法区分没有参数的构造函数
Mat4()
;从具有所有默认参数的构造函数
Mat4(float=0,float=0…)

按照您定义它们的方式,在调用Mat4()时需要调用什么构造函数是不明确的

简单的解决方案:
1.您可以向Mat4()添加伪参数,如Mat4(bool b)以解决歧义 或
2.使构造函数中具有多个参数的第一个参数成为非默认参数

所有这些解决方案都能解决问题,但不能解决问题的原因。
问题的原因是方法设计中的错误

更新(建议的解决方案-更改方法设计):
这样的错误表明您的类方法的设计不符合需要。
因此,正如@sth所建议的,使用一个构造函数,而不是模糊的2 所有需要的场景都可以在该构造函数的主体中处理,因此我们得到:

Matrix(float[] arr = 0, int sizeOfArray = 0)
{
  if (arr == 0)
    // use scenario which you used for Matrix()
  else // use scenario which you used for Matrix(float,float...)
}
第二个变量,而不是在构造函数主体中进行检查并根据条件选择变量,您可以实现基于重载解决方案的选择:
当您需要2个构造函数时:

Matrix(float[] arr, int sizeOfArray)
Matrix()

编译器不知道是“Mat4()”还是
定义“Mat4 I”时,“Mat4(float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0、float=0)”

编译器如何知道您是要调用没有参数还是所有默认参数的Mat4?您需要删除默认构造函数(因此总是使用全零调用
Mat4
),或者让非默认构造函数的第一个参数没有默认值(例如:
Mat4(float,float=0,float=0,float=0,float=0,float=0,float=0,float=0,float=0,float=0,float=0,float=0,float=0,float=0);
)(注意第一个float没有默认参数)第二个选项起了作用,非常有用,谢谢!我原以为编译器会知道“Mat4”是否被赋予了选项,然后删除非默认值来修复我的问题。@ Steve Lorimer:在C++术语中,这两个构造函数都是默认构造函数。这实际上是什么导致了歧义:OP声明了一个使用两个默认构造函数初始化,编译器不知道使用哪一个。您的第二个选项建议将一个默认构造函数转换为非默认构造函数。3.也许您不需要两个单独的构造函数,也许有所有默认参数的构造函数就够了。@sth当然,就够了,还应该更改签名,而不是float,float,float…我建议(float[],int size)你为什么这么建议?@Oktalist因为它更通用
std::initializer_list
,或者一对迭代器更通用,避免进入C程序员的思维模式。