C++ 指针算术。没有运算符"+" 匹配这些操作数
C++ Pointer arithmetic. No Operator "+" Matches these operands
我正在尝试将一个类的深度副本预制到另一个类。使用 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
实现中的一些更改才能解决问题
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 错误 C2679:二进制"<<":未找到采用类型 'std::string_view' 的右侧操作数的运算符(或者没有可接受的转换)
- 是否所有C++运算符都接受操作数?
- 一元*运算符的操作数是否期望一个 prvalue
- C2678 二进制 '==':未找到采用 'Card' 类型左操作数的运算符(或者没有可接受的转换)
- 我的运算符重载是否有效<<(流插入)左操作数不是 ostream
- 没有运算符"="与这些操作数匹配,JUCE 窗口演示应用程序
- C2679 二进制"<<":未找到采用右操作数类型的运算符
- CPP 运算符重载操作数位置 [] 与 ==
- int* 和 int[] 类型对二进制运算符 + 的操作数无效
- 运算符'<'不能应用于类型 'string' 和 'string' 的操作数
- 错误 C2679 二进制"<<":未找到采用类型为 'T' 的右侧操作数的运算符
- 是否允许三元运算符在C++中计算两个操作数?
- 二进制 '==':未找到采用 'Enemy' 类型左侧操作数的运算符(或者没有可接受的转换)
- 与"运算符>>"不匹配(操作数类型为"QDataStream"和"QJsonObject")
- 类型"int"和"const char [15]"到二进制"运算符<<"的无效操作数^
- 如何摆脱逗号运算符的这个错误右操作数没有效果( wunsued 值)?
- c++ 错误:二进制"运算符+"类型"矩阵*"和"矩阵*"的操作数无效
- c++运算符重载-我实际返回的操作数类型是什么
- 没有运算符>>与这些操作数匹配 ifstream