【问题标题】:c++ global operator not playing well with template classc++ 全局运算符不能很好地与模板类一起使用
【发布时间】:2010-03-31 01:27:25
【问题描述】:

好的,我在 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;
    }

对我来说,这似乎是正确的。但是,当我尝试编译代码时,出现以下错误(从 operator+ 函数抛出):

binary '+=' : no operator found which takes a right-hand operand of type 'const matrix::Matrix<T,ROWS,COLS>' (or there is no acceptable conversion)

我不知道该怎么做。任何帮助,如果不胜感激!

【问题讨论】:

  • 另外,您需要typename vector&lt;T&gt;::size_type,您应该重新考虑是否需要friend

标签: c++ generics templates function


【解决方案1】:

你的operator+=在这里:

Matrix<T, ROWS, COLS> & operator+=( const T & value )

定义将T(标量)添加到Matrix&lt;T, ROWS, COLS&gt; 的方法。

此声明:

return returnValue += lhs;

尝试将Matrix&lt;T, ROWS, COLS&gt;(矩阵,lhs 的类型)添加到Matrix&lt;T, ROWS, COLS&gt;

所以编译器说你没有定义那个操作是完全正确的。您有一个将标量添加到矩阵的 operator+=,但没有将矩阵添加到矩阵的 operator+=

【讨论】:

  • 哇,感谢您为我指出这一点。实际上,我不久前回去并更改了一些功能,却忘记了它在做什么……哈哈。好吧,我不确定这个问题是否“值得 StackOverflow”,但我不确定我是否会很快注意到这一点。谢谢!
  • 有时拥有第二(或第三、或第四)双眼睛会有所帮助。 :)
【解决方案2】:

Tyler 已经回答,但如果您能容忍我,我将不胜感激 :)

有一个非常棒的 Boost 库 (YABL ?),名为 Boost.Operators,可以让您摆脱编写所有这些东西的乏味。

这个想法是:

  • +可以从+=推导出来
  • != 可以从== 推导出来
  • &lt;=&gt;=&gt;可以从&lt;推导出来
  • 等等……

库允许您编写一个运算符并自动添加其他运算符,这要归功于一些模板魔术。它允许对称(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 有意义,T + UU + T 都会生成!

【讨论】:

    猜你喜欢
    • 2011-05-28
    • 1970-01-01
    • 2010-12-13
    • 1970-01-01
    • 1970-01-01
    • 2011-07-23
    • 2016-05-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多