我正在创建一个简单的C ++矩阵模板类,其定义如下:
template<uint n, uint m, typename T = double>
class Matrix {
private:
T data[n][m];
static Matrix<n, m, T> I;
public:
Matrix();
Matrix(std::initializer_list<T> l);
T& at(uint i, uint j); // one-based index
T& at_(uint i, uint j); // zero-based index
template<uint k> Matrix<n, k, T> operator*(Matrix<m, k, T>& rhs);
Matrix<m, n, T> transpose();
Matrix<n, m, T> operator+(const Matrix<n, m, T>& rhs);
Matrix<n, m, T>& operator+=(const Matrix<n, m, T>& rhs);
Matrix<n, m, T> operator-(const Matrix<n, m, T>& rhs);
Matrix<n, m, T>& operator-=(const Matrix<n, m, T>& rhs);
Matrix<n, m, T> operator*(const T& rhs);
Matrix<n, m, T>& operator*=(const T& rhs);
Matrix<n, m, T> operator/(const T& rhs);
Matrix<n, m, T>& operator/=(const T& rhs);
static Matrix<n, m, T> identity();
};
(uint
定义为unsigned int
)
最终函数Matrix<n, m, T> identity()
旨在使用基本单例模式返回静态I
成员,该成员是单位矩阵。显然,单位矩阵仅为方形矩阵定义,所以我尝试了这个:
template<uint n, typename T>
inline Matrix<n, n, T> Matrix<n, n, T>::identity() {
if (!I) {
I = Matrix<n, n, T>();
for (uint i = 0; i < n; ++i) {
I.at(i, i) = 1;
}
}
return I;
}
出现错误C2244 'Matrix<n,n,T>::identity': unable to match function definition to an existing declaration
。
我的印象是,我可以对模板进行某种特殊化,其中列数和行数相等。我不确定这是否可行,但我们非常感谢您的帮助。
答案 0 :(得分:1)
答案 1 :(得分:0)
Partial specialization模板类,但不允许其单个成员使用。
部分专业化的成员与主要成员无关 模板。
这就是编译错误背后的原因。
当然,将矩阵模板的整个矩阵模板专门化是没有意义的。 @tkausl已经回答了如何使identity()
函数仅适用于方阵矩阵。
但是,我想提请您注意实施Matrix
时的几个问题:
矩阵数据是普通数组(而不是动态分配的数组或std::vector
)。这有以下缺点:
sizeof(Matrix<N, M, T>) == sizeof(T)*N*M
。在堆栈上分配大型矩阵可能会导致stack overflow。但是,如果矩阵维度在编译时常量固定,那么很可能,它们将是小数字。如果是这样,支付动态分配的费用可能确实是不合理的。
identity()
按值返回结果(而不是通过常量引用)。
I
(单位矩阵)是该类的静态成员。最好将它变成identity()
函数中的静态变量。