C++ 指针运算。没有运算符“+”匹配这些操作数

C++ Pointer arithmetic. No Operator "+" Matches these operands

我正在尝试将一个 class 的深拷贝预成型到另一个。使用VS2015。

下面关于 *(clsOriginalToCopy + lngIndex);是我得到错误的地方,我不知所措。

for (lngIndex = 0; lngIndex < lngSize; lngIndex += 1)
{
    *(this + lngIndex) = *(clsOriginalToCopy + lngIndex);
}

编辑

错误 C2784 'std::basic_string<_Elem,_Traits,_Alloc> std::operator +(std::basic_string<_Elem,_Traits,_Alloc> &&,const _Elem)':无法从 'const CResizableArray' 作业 8 - DeepCopy 479

中推断出 'std::basic_string<_Elem,_Traits,_Alloc> &&' 的模板参数

编辑

MCVE。它希望我添加更多细节,所以请欣赏

中的这段摘录

"Hitchhikers guide to the galaxy"

“例如,在地球上,人类一直认为自己比海豚更聪明,因为他取得了如此多的成就——摩天轮、纽约、战争等等——而所有的海豚都做过在水里玩得很开心。但相反,海豚一直认为它们比人类聪明得多——原因完全相同。” ― 道格拉斯·亚当斯,银河系漫游指南

CResizableArray::CResizableArray()
{
    Initialize(0, 0);
}

CResizableArray::CResizableArray(long lngSize)
{
    Initialize(lngSize, 0);
}

CResizableArray::CResizableArray(long lngSize, long lngValue)
{
    Initialize(lngSize, lngValue);
}

void CResizableArray::Initialize(long lngSize, long lngValue)
{
    m_lngArraySize = 0;
    m_palngValues = 0;

    SetSize(lngSize, lngValue);
}

void CResizableArray::operator = (const CResizableArray &clsOriginalToCopy)
{
    if (this != &clsOriginalToCopy)
    {
        CleanUp();
        DeepCopy(clsOriginalToCopy);
    }
}

CResizableArray::~CResizableArray()
{
    CleanUp();
}


void CResizableArray::CleanUp()
{
    SetSize(0, 0);
}

void CResizableArray::SetSize(long lngNewSize)
{
    SetSize(lngNewSize, 0);
}

void CResizableArray::SetSize(long lngNewSize, long lngValue)
{
    long* palngNewValues = 0;
    long lngIndex = 0;
    long lngStop = 0;

    if (lngNewSize <      0) lngNewSize = 0;
    if (lngNewSize > 100000) lngNewSize = 100000;

    palngNewValues = new long[lngNewSize];

    for (lngIndex = 0; lngIndex < lngStop; lngIndex += 1)
    {
        *(palngNewValues + lngIndex) = lngValue;
    }

    if (lngNewSize < m_lngArraySize) lngStop = lngNewSize;
    else                             lngStop = m_lngArraySize;

    for (lngIndex = 0; lngIndex < lngStop; lngIndex += 1)
    {
        *(palngNewValues + lngIndex) = *(m_palngValues + lngIndex);
    }

    if (m_palngValues != 0)
    {
        delete[] m_palngValues;
        m_palngValues = 0;
    }

    m_palngValues = palngNewValues;

    m_lngArraySize = lngNewSize;
}

void CResizableArray::DeepCopy(const CResizableArray &clsOriginalToCopy)
{
    long lngSize = 0;
    long lngIndex = 0;

    lngSize = clsOriginalToCopy.GetSize();

    SetSize(lngSize);

    for (lngIndex = 0; lngIndex < lngSize; lngIndex += 1)
    {
        *(this + lngIndex) = *(clsOriginalToCopy + lngIndex);
    }
}

导师回复

"this"关键字是指向当前活动实例的指针,在本例中是 CResizableArray 的实例。

您有 "this + lngIndex" 正试图向其添加一个整数。如果你有一个实例数组并且你想跳转到列表下方具有索引的实例,那将是有意义的。但是您没有实例数组。您有一个实例,其中恰好有一个数组。

因此,您正试图在 class 之外上下移动。您真正想要做的是在 class.

内部 上下移动

导师回复

首先,在你提供的代码中我没有看到operator +,所以编译器是绝对正确的。

第二点我不明白的是*(clsOriginalToCopy + lngIndex)表达式...你的operator +应该return什么?指针?为什么不参考(考虑到你的operator =)?

尝试重新设计您的 class,也许 operator + 并不是真正需要的,只需对 DeepCopy 实施进行一些更改即可解决问题