模板类的赋值运算符

Posted

技术标签:

【中文标题】模板类的赋值运算符【英文标题】:Assignment operator of template class 【发布时间】:2015-01-27 22:47:11 【问题描述】:

我有这个例子:一个矩阵类,矩阵的维数作为模板参数给出。

template <std::size_t DIM>
class Matrix 
   // ...
;

int main()

  Matrix<2> m2;
  Matrix<4> m4;

  m2 = m4;

我的赋值运算符必须看起来像将 m2DIM 从 2 更改为 4 吗?

【问题讨论】:

Matrix&lt;2&gt; m2 (); 不会实例化矩阵对象。它将声明一个函数。 我的示例是我的实际课程的一个非常简单的版本,但在实际课程中,结构如下所示: Table U (5,1,10);这行得通!,它测试了它:) 现在我认为 Matrix m2 ();也应该工作 @MariusKüpper:推测和幻想从来都不是学习 C++ 的好方法 :-( @MariusKüpper Ridchard 的回答中提出的内联模板应该可以解决问题。 您不能更改模板参数,它是类型的静态属性,而不是可以在运行时更改的动态。您可以将 int 从值 4 更改为值 3,但不能将其更改为 long。同样,您可以更改Matrix&lt;2&gt; 的值,但不能将其类型更改为Matrix&lt;4&gt; 【参考方案1】:
template <std::size_t DIM>
class Matrix 

  template <std::size_t OtherDim>
  Matrix& operator=(const Matrix<OtherDim>& rhs)
  
    // whatever magic you need in here
    return *this;
  

;

Matrix&lt;DIM&gt;Matrix&lt;OtherDim&gt; 是两种不同的类型。

要问的第一个问题是,“将Matrix&lt;4&gt; 分配给Matrix&lt;2&gt; 是否存在逻辑操作?”。

答案可能是“不”。

Matrix&lt;2&gt;Matrix&lt;2&gt; 之间可能存在有效分配:

template <std::size_t DIM>
class Matrix 
  // implement a copy constructor...
  Matrix(const Matrix& rhs)
  : /* copy-initialise all data */
  
    /* any other copy-related logic */
  

  // ...and a copy-assignment operator
  Matrix& operator=(const Matrix& rhs)
  
    if (&rhs != this) 
      Matrix tmp(rhs);
      std::swap(*this, tmp);
    
    return *this;
  

;

【讨论】:

是的,这就是我尝试过的,但它不知道如何在操作员中将 DIM 更改为 OtherDim 您无法更改 Dim,这是其类型的一部分,您无法更改对象的类型 @JonathanWakely 这是我的想法,所以这告诉我们运算符必须返回 Matrix 的对象,它不会返回 *this 但这是我的问题:如果我使用像这样的运算符这将返回的对象的名称为 m2 ?? 第一个要问的问题是,“有没有将 Matrix 赋值给 Matrix 的逻辑运算?”答案是:我的教授要求它,所以我必须实施它:p 但您希望分配的结果是Matrix&lt;4&gt;Matrix&lt;2&gt;【参考方案2】:

我的赋值运算符必须看起来像将 m2 的 DIM 从 2 更改为 4 吗?

你不能这样做,这是不可能的。

您不能更改对象类类型的模板参数,它是该类型的静态属性,而不是可以在运行时更改的动态。

您可以将 int 从值 4 更改为值 3,但不能将其更改为 long。同样,您可以更改Matrix&lt;2&gt; 的值,但不能将其类型更改为Matrix&lt;4&gt;

没有办法做到m2 = m4 并让它意味着任何明智的事情。

也许您希望维度是类型的动态属性,而不是模板参数:

class Matrix 
  std::size_t m_dim;
  // ...
;

现在您可以在运行时更改值,因此分配给类型可以更改其m_dim 值。

【讨论】:

以上是关于模板类的赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章

包含指向派生模板类的基类指针的类的赋值运算符和复制构造函数

带有模板类的赋值运算符 - 没有可接受的转换,C++

模板类复制内部类问题中的模板赋值运算符

引用模板类型的赋值运算符需要非常量重载

模板类赋值运算符类

模板赋值运算符重载之谜