模板参数作为其他模板的参数

时间:2014-08-18 13:09:46

标签: c++ templates

我有一个Matrix课程。它是一个模板,带有用于静态分配小矩阵的类型,行和列。问题是运算符*和运算符* =的重载。在这种情况下,必须为另一个对象授予操作:相同类型,行等于我的列和多个列。我现在编写了这段代码并且它有效,但我想知道我是否可以强制使用相同的类型T而不是另一种类型T1。行和列也是一样。

template<typename T, int R, int C>
class Matrix {
 private:
   //some data.....
 public:
   //some methods.....
  template <typename T1, int R1, int C1> <----here I'd like to use T as type
  Matrix<T,R,C1> operator*(const Matrix<T,R1,C1>& rhs);
  template <typename T1, int R1, int C1>
  Matrix<T,R,C1>& operator*=(const Matrix<T,R1,C1>& rhs);
}

2 个答案:

答案 0 :(得分:3)

对于operator *,模板参数不必与函数参数匹配,因此您可以将其保留。此外,还有一个限制,即第二个矩阵的行数与第一个矩阵的列数相匹配,因此您实际上只需要一个模板参数:

template<typename T, int R, int C>
class Matrix {
 private:
   //some data.....
 public:
   //some methods.....
  template <int C1>
  Matrix<T,R,C1> operator*(const Matrix<T,C,C1>& rhs) const;
};

operator *=只适用于方形矩阵,所以你必须小心。

答案 1 :(得分:1)

template<typename T, int R, int C>
class Matrix {
 private:
   //some data.....
 public:
   //some methods.....
  template <int C2>
  Matrix<T,R,C2> operator*(const Matrix<T,C,C2>& rhs);
  Matrix& operator*=(const Matrix<T,C,C>& rhs);
}

您可以使用封闭类中的模板参数,不用担心。

无论如何,我将两个运算符都减少到矩阵乘法实际允许的范围。