带数组的重载赋值运算符

Posted

技术标签:

【中文标题】带数组的重载赋值运算符【英文标题】:Overloaded assignment operator with arrays 【发布时间】:2021-11-27 02:46:51 【问题描述】:

我的目标是能够做到这一点:

#include "rMatrix.h"

int main()     

    rMatrix<double>    testMat1;
    rMatrix<double>    testMat2;

    int td1[] = 1,2,3,4;
    int td2[] = 1,2,3,4;

    testMat1 = td1;
    testMat2 = td2;


很遗憾,我的努力没有成功。 Matrix.h 以下供参考以及错误信息。

尝试包括:

删除 template &lt;class U&gt; 指定用于类型转换。 删除 template &lt;std::size_t N&gt; 并更改为 const T (&amp;RHS)[]。 删除 [] 迫使我以testMat1 = *td1 的身份通过,我发现 次优

1>e:\documents\visual studio 2012\projects\nntest\nntest\rmatrix.h(26):错误 C3857: 'rMatrix::operator =': 没有多个模板参数列表 允许 1> e:\documents\visual studio 2012\projects\nntest\nntest\rmatrix.h(31) :参见类参考 模板实例化“rMatrix”正在编译 1>e:\文档\视觉工作室 2012\projects\nntest\nntest\rmatrix.h(102):错误 C2244: 'rMatrix::operator =' : 无法将函数定义与 现有声明 1> 定义 1> 'rMatrix &rMatrix::operator =(const U (&)[N])' 1> 现有 声明 1> 'rMatrix &rMatrix::operator =(const U (&)[N])' 1> 'rMatrix &rMatrix::operator =(const rMatrix &)' 1>e:\documents\visual studio 2012\projects\nntest\nntest\rmatrix.h(26):错误 C3857: 'rMatrix::operator =': 没有多个模板参数列表 允许 1> with 1> [ 1> T=float 1> ] 1> e:\documents\visual studio 2012\projects\nntest\nntest\source.cpp(12) :参见类参考 模板实例化 'rMatrix' 正在编译 1> 和 1> [ 1> T=float 1> ] 1>e:\documents\visual studio 2012\projects\nntest\nntest\rmatrix.h(26):错误 C3857: 'rMatrix::operator =': 没有多个模板参数列表 允许 1> with 1> [ 1> T=double 1> ] 1> e:\documents\visual studio 2012\projects\nntest\nntest\source.cpp(13) :参见类参考 模板实例化 'rMatrix' 正在编译 1> 和 1> [ 1> T=double 1> ] 1>e:\documents\visual studio 2012\projects\nntest\nntest\source.cpp(19):错误 C2679:二进制“=”: 未找到采用“int [4]”类型的右手操作数的运算符 (或者没有可接受的转换) 1> e:\documents\visual 工作室 2012\projects\nntest\nntest\rmatrix.h(24): 可能是 'rMatrix &rMatrix::operator =(const rMatrix &)' 1> with 1> [ 1> T=float 1> ] 1> 试图 将参数列表 '(rMatrix, int [4])' 1> 与 1> 匹配 [ 1> T=float 1> ] 1>e:\documents\visual studio 2012\projects\nntest\nntest\source.cpp(20):错误 C2679:二进制“=”: 未找到采用“int [4]”类型的右手操作数的运算符 (或者没有可接受的转换) 1> e:\documents\visual 工作室 2012\projects\nntest\nntest\rmatrix.h(24): 可能是 'rMatrix &rMatrix::operator =(const rMatrix &)' 1> with 1> [ 1> T=double 1> ] 1> 试图 将参数列表 '(rMatrix, int [4])' 1> 与 1> 匹配 [ 1> T=double 1> ] 1> 1>构建失败。

"rMatrix.h"

#include <algorithm>

template <class T>
class rMatrix 

    private:
        
        T* data;
        int colN;
        int rowN;

    public:

        rMatrix();
        rMatrix(unsigned int size);
        rMatrix(int row,int col);
        rMatrix(const rMatrix& mat);
        ~rMatrix();

        T iloc(int index);
        T iloc(int row, int col);

        rMatrix<T>& operator=(const rMatrix & RHS);

        template <class U>
        template <std::size_t N>
        rMatrix<T>& operator=(const U (&RHS)[N]);       
        
        void reshape(int row,int col);
;

template <class T>
rMatrix<T>::rMatrix() : rowN(0), colN(0), data(NULL) 

template <class T>
rMatrix<T>::rMatrix(const rMatrix<T> & mat) 
    if (data != NULL) 
        data = new T[mat.rowN*mat.colN];
        std::copy(std::begin(mat.data),std::end(mat.data),std::begin(data));
    
    rowN = mat.rowN;
    colN = mat.colN;


template <class T>
rMatrix<T>::rMatrix(unsigned int size) : rowN(size), colN(1) 
    data = new T[size];
    for(unsigned int i = 0; i < size; i++) 
        data[i] = 0;    
    


template <class T>
rMatrix<T>::rMatrix(int row, int col) : rowN(row), colN(col) 
    unsigned int size = row*col;
    data = new T[size];
    for(unsigned int i = 0; i < size; i++) 
        data[i] = 0;
    
    


template <class T>
rMatrix<T>::~rMatrix() 
    if (data != NULL) 
        delete [] data;
    
    data = NULL;
    colN = 0;
    rowN = 0;


template <class T>
T rMatrix<T>::iloc(int index) 
    return data[index];


template <class T>
T rMatrix<T>::iloc(int row, int column) 
    return this->loc(row + column * rowN);


template <class T>
rMatrix<T>& rMatrix<T>::operator=(const rMatrix & RHS) 
    rowN = RHS.rowN;
    colN = RHS.colN;
    data = new T[rowN*colN];
    for(unsigned int i = 0; i < unsigned int(rowN*colN); i++) 
        data[i] = RHS.data[i];
    
    //std::copy(std::begin(RHS.data), std::end(RHS.data), std::begin(data));
    return *this;


template <class T>             //, std::size_t N>
template <class U>
template <std::size_t N>
rMatrix<T>& rMatrix<T>::operator=(const U (&RHS) [N]) 
    std::copy(std::begin(RHS),std::end(RHS),std::begin(data));
    return *this;

已解决

#include <algorithm>

template <class T>
class rMatrix 

    private:
        
        T* data;
        int colN;
        int rowN;

    public:

        rMatrix();
        rMatrix(unsigned int size);
        rMatrix(int row,int col);
        rMatrix(const rMatrix& mat);
        ~rMatrix();

        T iloc(int index);
        T iloc(int row, int col);

        rMatrix<T>& operator=(const rMatrix & RHS);


        template <class U, std::size_t N>
        rMatrix<T>& operator=(const U (&RHS)[N]);       
        
        void reshape(int row,int col);
;

/*** Other Functions ***/    

template <class T>             //, std::size_t N>
template <class U, std::size_t N>
rMatrix<T>& rMatrix<T>::operator=(const U (&RHS) [N]) 
    rowN = N;
    colN = 1;
    data = new T[N];

    for(unsigned int i = 0; i < unsigned int(rowN*colN); i++) 
        data[i] = static_cast<T>(RHS[i]);   
    
    return *this;

【问题讨论】:

template &lt;class U&gt; 的目的是什么?尤其是当您的声明是 rMatrix&lt;T&gt;&amp; operator=(const T (&amp;RHS)[N]); - U 未使用时。 糟糕,正在更改一堆内容,但在发布之前忘记将其切换回来。呵呵,对不起。修复。在第二点上,我认为它的目的是按照我的想法完成一些 Matrix = int[] 的事情。也许我让它变得比需要的更难。 【参考方案1】:

编译器告诉你第一个问题:不应该有 2 个模板行,如果你想要 U 和 N,它需要看起来像这样:

template <typename U, std::size_t N>
rMatrix<T>& operator=(const U (&RHS)[N]) ;

但是,为了简化,先试试这个:

template < std::size_t N>
rMatrix<T>& operator=(const int (&RHS)[N]) ;

我认为这无论如何都行不通。我相信数组是作为指针传递的,即使你声明了一个大小的参数。但是还是试试吧,我可能弄错了。 如果我是对的,那你就不走运了。您需要将值作为带有附加计数参数的指针,或切换到 std::array。

【讨论】:

啊,谢谢你的提示!解决了这个问题。不得不重新编写第二部分,但它起作用了...... 这教会了我一些非常有帮助的东西!我已经把数组参数藏在我的大脑中,认为它们是无用的,因为在我看来,将它们视为指针会破坏它们的目的。我不知道将它们作为参考传递实际上会使它们按我最初预期的方式工作。我想这是 C++ 在保持 C 兼容性的同时使该功能有用的方式。 有趣的是.. 归根结底,如果我不将它作为 const 传递,我可以使用 int (&amp;RHS) 而无需在前端更改任何内容 @987654324 @ 有效。

以上是关于带数组的重载赋值运算符的主要内容,如果未能解决你的问题,请参考以下文章

C++中赋值运算操作符和=重载有啥区别?

c++中为啥赋值运算符重载返回类型是引用

c++ 拷贝构造函数与赋值运算符重载函数的区别是

c++重载赋值操作符的返回值是啥?

c++中拷贝构造函数和赋值运算符重载本质上一样么

对象的动态内存和赋值运算符重载