c ++全局运算符与模板类不兼容

时间:2010-03-31 01:27:26

标签: c++ generics templates function

好吧,我在stackoverflow上发现了一些类似的帖子,但我找不到任何与我的确切情况相关的内容,而且我对给出的一些答案感到困惑。好的,所以这是我的问题:

我有一个模板矩阵类,如下所示:

    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)

我无法弄清楚该怎么做。任何帮助,如果非常感谢!

2 个答案:

答案 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 + Tt += u