我有一个模板矩阵类,如下所示:
template <typename T, size_t ROWS, size_t COLS>
class Matrix
{
public:
template<typename, size_t, size_t>
friend class Matrix;
Matrix( T init = T() )
: _matrix(ROWS, vector<T>(COLS, init))
{
/*for( int i = 0; i < ROWS; i++ )
{
_matrix[i] = new vector<T>( COLS, init );
}*/
}
Matrix<T, ROWS, COLS> & operator+=( const T & value )
{
for( vector<T>::size_type i = 0; i < this->_matrix.size(); i++ )
{
for( vector<T>::size_type j = 0; j < this->_matrix[i].size(); j++ )
{
this->_matrix[i][j] += value;
}
}
return *this;
}
private:
vector< vector<T> > _matrix;
};
我有以下全局函数模板:
template<typename T, size_t ROWS, size_t COLS>
Matrix<T, ROWS, COLS> operator+( const Matrix<T, ROWS, COLS> & lhs,
const Matrix<T, ROWS, COLS> & rhs )
{
Matrix<T, ROWS, COLS> returnValue = lhs;
return returnValue += lhs;
}
对我而言,这似乎是正确的。但是,当我尝试编译代码时,我收到以下错误(从操作符+函数抛出):
binary '+=' : no operator found which takes a right-hand operand of type 'const matrix::Matrix<T,ROWS,COLS>' (or there is no acceptable conversion)
我无法弄清楚该怎么做。任何帮助,如果非常感谢!
答案 0 :(得分:6)
你的operator+=
:
Matrix<T, ROWS, COLS> & operator+=( const T & value )
定义向T
添加Matrix<T, ROWS, COLS>
(标量)的方法。
本声明:
return returnValue += lhs;
尝试向Matrix<T, ROWS, COLS>
添加lhs
(矩阵,Matrix<T, ROWS, COLS>
的类型)。
因此编译器完全正确地说您没有定义该操作。您有一个operator+=
可以为矩阵添加标量,但不会为矩阵添加矩阵的operator+=
。
答案 1 :(得分:1)
Tyler
已经回答,但如果你忍受我,我会很感激的。)
有一个非常好的Boost库(YABL?),名为Boost.Operators,可以减轻您编写所有这些内容的乏味。
这个想法是:
+
可以从+=
!=
可以从==
<=
,>=
和>
可以从<
该库允许您编写一个操作符并自动添加其他操作符,这要归功于一些模板魔法。它允许对称(T + T
)和非对称(T + U
)运算符。
这里会给出:
template <class T, size_t Rows, size_t Columns>
class Matrix: boost::addable< Matrix<T,Rows,Columns> > // private inheritance
{
public:
Matrix& operator+=(const Matrix& rhs);
};
如果您想拥有多个+
运营商,也可能
template <class T, size_t Rows, size_t Columns>
class Matrix: boost::addable < Matrix<T,Rows,Columns>
, boost::addable < Matrix<T,Rows,Columns>, T
> >
// Note the nesting to avoid MI
{
public:
Matrix& operator+=(const T& value);
Matrix& operator+=(const Matrix& rhs);
};
更好的是,在非对称的情况下,只要T + U
有意义,就会生成U + T
和t += u
!