C ++模板矩阵类 - 方阵专业化

时间:2016-06-15 19:15:43

标签: c++ templates matrix static

我正在创建一个简单的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

我的印象是,我可以对模板进行某种特殊化,其中列数和行数相等。我不确定这是否可行,但我们非常感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

试试这个:

<?php
echo "Testo";

请参阅:http://cpp.sh/7te2z

答案 1 :(得分:0)

整个类允许

Partial specialization模板类,但不允许其单个成员使用。

  

部分专业化的成员与主要成员无关   模板。

这就是编译错误背后的原因。

当然,将矩阵模板的整个矩阵模板专门化是没有意义的。 @tkausl已经回答了如何使identity()函数仅适用于方阵矩阵。

但是,我想提请您注意实施Matrix时的几个问题:

  1. 矩阵数据是普通数组(而不是动态分配的数组或std::vector)。这有以下缺点:

    • sizeof(Matrix<N, M, T>) == sizeof(T)*N*M。在堆栈上分配大型矩阵可能会导致stack overflow
    • 不可能利用移动语义(因为数据与矩阵对象不可分割)。

    但是,如果矩阵维度在编译时常量固定,那么很可能,它们将是小数字。如果是这样,支付动态分配的费用可能确实是不合理的。

  2. identity()按值返回结果(而不是通过常量引用)。

  3. I(单位矩阵)是该类的静态成员。最好将它变成identity()函数中的静态变量。