我正在完成與矩陣乘法有關的任務。我們收到了一些我已經填寫的骨架文件;但是我處理一個模棱兩可的構造錯誤,構造一定要留下它是分級的方式是相同的:模糊重載構造函數: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'全零),或者讓非默認構造函數的第一個參數沒有默認值(例如:'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 = 0 ,float = 0);')(注意第一個float沒有默認參數) –
第二個選項有效,非常有幫助,謝謝!我曾經認爲編譯器會意識到'Mat4'是否被賦予選項,刪除非默認值解決了我的問題。 –
@Steve Lorimer:在C++術語中,*這些構造函數都是* default *構造函數。這實際上是造成歧義的原因:OP聲明瞭一個具有兩個默認構造函數的類,編譯器不知道使用哪一個。你的第二個選項建議將一個默認構造函數轉換爲非默認構造函數。 – AnT