我正在完成一项与矩阵乘法有关的任务。我们得到了一些我填写的骨架文件;但是我正在处理一个模糊的构造函数错误,构造函数必须保持相同的分级方式:
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;
}
感谢您的帮助!
答案 0 :(得分:1)
编译器无法在没有参数的情况下区分构造函数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()
答案 1 :(得分:0)
编译器不知道“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 I“时