繁体   English   中英

模棱两可的重载构造函数:C ++

[英]Ambiguous Overloaded Constructor: C++

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

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(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...)
}

第二种变体 ,而不是将check放在构造函数的主体中并根据条件选择变体,可以实现基于重载分辨率的选择
当您需要2个构造函数时:

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM