2012-08-08 107 views
4

所以,我有我創建了具有以下運算符重載的通用矩陣類:C++運算符重載和繼承

class Matrix 
{ 
public: 
    Matrix() {} 
    Matrix(int i, int j, int k) {} 
    Matrix operator*(const Matrix &right) 
    { 
    } 
}; 

我也有,從我的矩陣類繼承的矩陣2類。

class Matrix2 : public Matrix 
{ 
}; 

當我嘗試乘兩個矩陣2的對象在一起,我得到一個編譯器錯誤,指出:

「沒有運營商發現,這需要類型矩陣2的左手操作數(或沒有訪問的變換) '

這是爲什麼,我該如何正確實現帶繼承的操作符重載?

編輯:

正如指出我的問題是部分原因是因爲「最棘手的解析」的。現在我的問題,我相信,嚴格地與操作符重載和繼承有關。

我可以將兩個Matrix對象相乘,但我無法將兩個Matrix2對象放在一起。

Matrix2 i; 
Matrix2 m; 
Matrix result = m * i; 

錯誤消息:

error C2678: binary '*' : no operator found which takes a left-hand operand of type 'Matrix2' (or there is no acceptable conversion).

+0

這只是一個猜測,但是您可以嘗試在超載聲明之前添加一個「public」修飾符 – 2012-08-08 20:36:26

+0

運算符重載位於Matrix類的公共部分。 – Bob 2012-08-08 20:38:20

+3

在所有情況下,一個完整的最小可編譯示例,使其他人能夠遇到同樣的錯誤,你做的是有用的。 – PlasmaHH 2012-08-08 20:38:51

回答

3

你咬的最棘手的解析。這是導致聲明函數而不是對象的語法錯誤。

+0

哦!我明白你的意思了。但是,我有2個構造函數:一個不需要參數,一個需要幾個參數。當我聲明2個對象(一個使用無參數構造函數,另一個使用帶多個參數的構造函數),並嘗試將它們相乘時,編譯器仍然抱怨。 – Bob 2012-08-08 21:04:37

+0

我已經更新了上面的問題。 – Bob 2012-08-08 21:05:05

2

的問題是不是與重載運算符,它與你定義,你可能會想,m1m2Matrix類型,但他們實際上都是函數返回Matrix(不帶參數)的變量。嘗試刪除聲明中的圓括號,看看事情是否更好。

這是@DeadMG在他的回答中提到的Most Vexing Parse

2

檢查出關於運算符重載的this article,它解釋得很好。

正如@silvesthu解釋的那樣,將乘法運算符作爲一個帶2個參數的靜態函數並返回一個新的對象可能會更好。如果您需要以某種方式修改您的班級,例如使用*=運算符,則可以使用靜態函數來實現此功能。

更新

編譯下面的代碼對我的作品;

class Matrix 
{ 
public: 
    Matrix() {} 
    Matrix(int i, int j, int k) {} 
    Matrix operator*(const Matrix &right) 
    { 
     return Matrix(); 
    } 
}; 

class Matrix2 : public Matrix 
{ 
}; 


int _tmain(int argc, _TCHAR* argv[]) 
{ 
    Matrix2 a, b; 
    Matrix c = a * b; 
    return 0; 
} 

顯示兩個Matrix2對象確實可以相乘。我不確定你爲什麼會遇到任何問題。