1

我对运算符重载有一些问题。我到处寻找,但找不到解决此错误的正确方法。这是我的代码的一些部分:

Matrix<type> Matrix<type>::operator/(const Matrix& denom){

if(num_of_rows != denom.num_of_rows || num_of_cols != denom.num_of_cols)
    throw string("Unable to divide (Different size).");
if(denom.contains(0))
    throw string("Unable to divide (Divide by zero).");

for(int i = 0; i < num_of_rows; i++)
    for(int j = 0; j < num_of_cols; j++)
        values[i][j] /= denom.values[i][j]; 
                    // I KNOW THIS IS NOT HOW TO DIVIDE TWO MATRICES

return *this;
 }

 void Matrix<type>::operator=(const Matrix& m) const {

delete [][] values;
num_of_rows = m.num_of_rows;
num_of_cols = m.num_of_cols;
values = new type*[num_of_rows];

for(int i = 0; i < num_of_rows; i++){
    *(values + i) = new type[num_of_cols];
    for(int j = 0; j < num_of_cols; j++)
        values[i][j] = m.values[i][j];
}
 }

这是 Matrix 类,构造函数有 2 个参数:

class Matrix{

private:
    type** values;
    int num_of_rows, num_of_cols;

public:
    Matrix(){}
    Matrix(int, int);
    type getElement(int, int);
    void print();
    bool contains(type);
    Matrix<type> operator/(const Matrix&);
    void operator=(const Matrix&) const;
};

template <class type>

Matrix<type>::Matrix(int rows, int cols){

values = new type*[rows];
num_of_rows = rows;
num_of_cols = cols;

for(int i = 0; i < rows; i++){
    *(values + i) = new type[cols];
    for(int j = 0; j < cols; j++){
            type random = (type)rand() / 3276.71;
        values[i][j] = random;
    }
}
}

而 main 中的这段代码给出了这个错误:

srand(time(NULL));
Matrix<int> m1(3,5);  // creating some objects 
Matrix<double> m2(3,5);  // matrices’ elements are assigned randomly from 0 to 10
Matrix<double> m3(5,5);
Matrix<double> m4(5,6);
if(!(m2.contains(0))){
    Matrix<double> m8(3,5);
    m8=m1/m2; // THIS LINE GIVES ERROR
    m8.print();
}
4

2 回答 2

4

m1有 type Matrix<int>,所以在寻找合适的重载时,operator/我们发现:

Matrix<int> Matrix<int>::operator/(const Matrix& denom);

注意Matrix这里的参数类型使用了所谓的注入类名。这意味着Matrix在这种情况下代表Matrix<int>,因为那是有问题的(模板)类。但是m2,调用 to 的参数operator/具有类型Matrix<double>。没有合适的从Matrix<double>to转换,Matrix<int>所以调用无效。

一个可能的解决方法是更改operator/​​为模板:

// Declared inside Matrix<type>:
template<typename Other>
Matrix& operator/=(Matrix<Other> const& other);

(我还冒昧地修复了操作符,以更好地反映它实际在做什么。)

但是,您将遇到问题,您正在使用 a Matrix<int>(调用的结果operator/)来分配m8具有 typeMatrix<double>的。因此,也许您需要进行operator=转换(在这种情况下,我也建议使用转换构造函数,或者甚至只是不带转换的构造函数operator=)。

于 2012-05-13T07:01:38.070 回答
0

错误消息非常清楚地表明您没有定义一个除法运算符,将这两种类型作为您传递的参数。查看代码摘录是这种情况:有一个运算符采用两个Matrix<T>但没有一个采用 aMatrix<T1>和 a Matrix<T2>(对于不同的类型T1and T2)。

顺便说一句,你的问题是什么?

于 2012-05-13T07:06:29.803 回答