模板函数重载c ++

时间:2015-01-11 08:49:48

标签: c++ templates operator-overloading overloading

我正在研究通用矩阵类。 我要重载+函数,以便何时执行:

  1. matrix =标量*矩阵
  2. matrix = matrix * scalar
  3. matrix = matrix * matrix
  4. 试图这样做(函数重载): 这是一种正确的方法吗?

    template<class T>
    class Matrix
    {
        std::vector< std::vector<T> > mat;
        size_t rows , cols;
    
    public:
        Matrix(){}
        Matrix(const std::string){  }
        Matrix(const size_t r, const size_t c, const std::vector<T> v){ }
        Matrix(const Matrix& other);
    
        Matrix<T> operator=(const Matrix<T> &other)  {  }
    
        Matrix<T> operator+(const Matrix<T> &other) const{}
    
        friend Matrix<T> operator*(const T &mat, const Matrix<T> &scalar) { }
    
        friend Matrix<T> operator*(const Matrix<T> &mat, const T &scalar) { }
    
        friend Matrix<T> operator*(const Matrix<T> &mat, const Matrix<T> &other) {  }
    

    此外,我很高兴知道我的声明是否存在问题。 谢谢你的帮助。

2 个答案:

答案 0 :(得分:0)

如果您想重载operator*以允许

  1. matrix =标量*矩阵
  2. matrix = matrix * scalar
  3. matrix = matrix * matrix
  4. 您需要将这三个运算符重载定义为矩阵类周围的命名空间中的函数:

    class Matrix { ... };
    Matrix operator*(Scalar const& s, Matrix const& m) { ... }
    Matrix operator*(Matrix const& m, Scalar const& s) { ... }
    Matrix operator*(Matrix const& m1, Matrix const& m2) { ... }
    

    在你的情况下,你在类中声明了运算符为friend函数,它们也是如此,因为它实际上声明了自由函数,而使它们成为friends。如果实际需要friend,则取决于实施。如果没有,为了清楚起见,我会将它们移到课堂外,但请记住,您需要template<typename T>。关于其余代码,没有什么明显被破坏,但它只是真实代码的摘录。

答案 1 :(得分:-2)

看看这个问题,我有另一个想法。

matrix = scalar * matrix
matrix = matrix * scalar
matrix = matrix * matrix

另一种方法是使用函数对象并将它们传递给矩阵类,这样函数对象就可以处理算法细节......这样你就可以在以后需要的时候再添加它们。

运算符链接在上面的代码中也很方便,因此,通过引用返回重载运算符。