模板化类中的c ++赋值运算符实现

时间:2010-12-09 22:51:28

标签: c++ templates assignment-operator

我正在构建自己的矩阵类以巩固我对c ++的理解。它是模板化的,所以我可以有一个int矩阵或浮点数或布尔矩阵。我不会实现复制构造函数或赋值运算符或析构函数,因为我不会有任何动态成员元素,但如果我有:

Matrix<float,3,4> mat1;
Matrix<int,45,45> mat2;
mat1 = mat2;

它返回以下错误:

/Users/Jake/Dropbox/C++/test.cpp: In function ‘bool test1()’:
/Users/Jake/Dropbox/C++/test.cpp:23: error: no match for ‘operator=’ in ‘m2 = m1’
/Users/Jake/Dropbox/C++/Matrix.h:22: note: candidates are: Matrix<float, 3u, 4u>& Matrix<float, 3u, 4u>::operator=(const Matrix<float, 3u, 4u>&)

如果两个矩阵都是浮点数或两者都是int,那就没关系。尺寸不必匹配。因此默认赋值运算符效果很好,除非它们的类型不同。所以我实现了自己的赋值运算符:

template <class T, unsigned int rows, unsigned int cols>
template <class T2, unsigned int rows2, unsigned int cols2>
Matrix<T, rows2, cols2> & Matrix<T,rows,cols>::operator= (const Matrix<T2, rows2, cols2> & second_matrix){
        unsigned int i,j;
for (i=0; i < rows2; i++){
    for (j=0; j < cols2; j++){
        data[i][j] = second_matrix(i,j);    
    }
}
this->_rows = rows2;
this->_cols = cols2;
return *this;
}

如果它们是不同类型但尺寸相同,则可以工作 - 但第二种类型的值会从第二种类型转换为第一种类型。我的问题是,如何设置它们以使它们可以是不同的类型和不同的尺寸,并将其设置为指向第二个或第二个的副本?

2 个答案:

答案 0 :(得分:1)

  

如何设置它们以便它们可以是不同类型和不同尺寸,只需将其设置为指向第二个或第二个副本?

你没有。

mat未指向Matrix<float,3,4>;它是Matrix<float,3,4>。它永远不会是别的。无法将mat变为Matrix<int,45,45>

如果您希望能够指向不同的对象,则需要使用指针(或引用)。为了能够指向可以指向Matrix的任何特化的指针,您需要创建一个基类并从该基类派生Matrix

class MatrixBase { };

template <typename T, unsigned Rows, unsigned Columns>
class Matrix : public MatrixBase { };

然后,您可以使用MatrixBase*指向任何Matrix类型的对象,并且可以使用MatrixBase&来引用任何Matrix类型的对象。您需要将尽可能多的共享功能放入MatrixBase类或使用虚函数。

答案 1 :(得分:1)

你遇到的问题是你有三种类型,但你只提两种。从根本上说,

Matrix<float,3,4> mat1;
Matrix<int,45,45> mat2;
mat1 = mat2;

无效,因为作业的结果应为Matrix<float, 45, 45>,但mat1的类型为Matrix<float, 3, 4>。这不可能改变。

是否有理由矩阵的尺寸必须属于该类型的一部分?看起来你真的想让这些东西动态变化。只是做:'

template <class T>
class Matrix
{
    unsigned int rows;
    unsigned int cols;
  public:
    Matrix(numrows, numcols): rows(numrows), cols(numcols) {}
};

等...然后您可以在运行时更改矩阵的尺寸。

相关问题