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

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

本文关键字:操作数 运算符 指针 C++      更新时间:2023-10-16

我正在尝试将一个类的深度副本预制到另一个类。使用 VS2015。

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

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

编辑

错误 C2784 "std::basic_string<_Elem,_Traits,_Alloc> std::运算符 +(std::basic_string<_Elem,_Traits,_Alloc> &&,const _Elem(":无法从"const CRessizeableArray"家庭作业 8 中推断出"std::basic_string<_Elem,_Traits,_Alloc> &&"的模板参数 - 深度复制 479

编辑

麦克维。它希望我添加更多详细信息,因此请欣赏此摘录

"银河系漫游指南">

"例如,在地球上,人类一直认为他比海豚更聪明,因为他取得了如此多的成就——轮子、纽约、战争等等——而海豚所做的一切都是在水中玩得很开心。但相反,海豚一直认为它们比人类聪明得多——原因完全相同。——道格拉斯·亚当斯(Douglas Adams(,《银河系漫游指南》(The Hitchhiker's 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"关键字是指向当前活动实例的指针,在本例中是CRessizeableArray的实例。

你有"this + lngIndex",它试图向它添加一个整数。 如果您有一个实例数组,并且想要跳转到列表下方具有索引的实例,这将很有意义。 但是您没有实例数组。 你有一个实例,里面碰巧有一个数组。

所以,你试图在课堂外上下移动。 你真正想做的是在课堂上下移动。

教师的回复

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

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

尝试重新设计您的类,也许operator +并不是真正需要的,只有DeepCopy实现中的一些更改才能解决问题

相关文章: