c++;模板类中赋值运算符的实现 我正在构建我自己的矩阵类来巩固我的C++理解。它是模板化的,所以我可以有一个int矩阵,一个float,或者布尔矩阵。我不会实现复制构造函数、赋值运算符或析构函数,因为我不会有任何动态成员元素,但如果我有: Matrix<float,3,4> mat1; Matrix<int,45,45> mat2; mat1 = mat2; 矩阵mat1; 矩阵mat2; mat1=mat2;

c++;模板类中赋值运算符的实现 我正在构建我自己的矩阵类来巩固我的C++理解。它是模板化的,所以我可以有一个int矩阵,一个float,或者布尔矩阵。我不会实现复制构造函数、赋值运算符或析构函数,因为我不会有任何动态成员元素,但如果我有: Matrix<float,3,4> mat1; Matrix<int,45,45> mat2; mat1 = mat2; 矩阵mat1; 矩阵mat2; mat1=mat2;,c++,templates,assignment-operator,C++,Templates,Assignment Operator,它返回以下错误: /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>& Matri

它返回以下错误:

/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>&)
/Users/Jake/Dropbox/C++/test.cpp:在函数“bool test1()”中:
/Users/Jake/Dropbox/C++/test.cpp:23:错误:“m2=m1”中的“operator=”不匹配
/Users/Jake/Dropbox/C++/Matrix.h:22:注:候选项为:矩阵和矩阵::运算符=(常数矩阵和)
如果这两个矩阵都是float或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;
}
模板
模板
矩阵和矩阵::运算符=(常数矩阵和第二个_矩阵){
无符号整数i,j;
对于(i=0;i\u行=行2;
这个->\u cols=cols2;
归还*这个;
}
如果它们是不同的类型,但尺寸相同,则此操作有效-但第二种类型中的值将从第二种类型转换为第一种类型。我的问题是,我如何设置它,使它们可以是不同的类型和不同的维度,并将其设置为指向第二个,或第二个的副本

我如何设置它,使它们可以是不同的类型和不同的维度,并将其设置为指向第二个,或第二个的副本

你没有

mat
不指向
矩阵
;它是一个
矩阵
。这不可能是别的。无法将
mat
转换为
Matrix

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

class MatrixBase { };

template <typename T, unsigned Rows, unsigned Columns>
class Matrix : public MatrixBase { };
类矩阵基{};
模板
类矩阵:公共矩阵基{};

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

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

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

等等。。。然后可以在运行时更改矩阵的维度

你确定要
类型名
,而不是
无符号整数
?@TokenMacGuy:你是什么意思?它们是未签名的!:-哦(谢谢,哈哈)我到底在想什么?为什么矩阵的维度是类型的一部分而不是其中的变量?但这是一个完全不同的矩阵类,它不再在堆栈上,它必须动态分配它的元素。通常,由于对密集矩阵的操作非常缓慢,因此大小没有那么大,因此为了性能起见,使用堆栈分配的矩阵是有利的。如果你问我,我更喜欢将维度放在类型中,因为我认为更改矩阵的维度没有任何意义。然而,海报想要完成这个任务,这就是结果。好吧,我理解它基本上归结为设计选择。我不希望动态分配数据,所以我只需要坚持按照矩阵设置的参数,嗯?我原以为我可以两全其美,但我明白我必须如何选择。谢谢,伙计们。我如何设置它,使它们可以是不同的类型和不同的尺寸,并将其设置为指向第二个,或第二个的副本?它已经解释过,你不能,C++阻止你对矩阵理论中不存在的矩阵进行运算——你不能分配矩阵,这些维度不相同。
template <class T>
class Matrix
{
    unsigned int rows;
    unsigned int cols;
  public:
    Matrix(numrows, numcols): rows(numrows), cols(numcols) {}
};