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
实施进行一些更改即可解决问题
我正在尝试将一个 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
实施进行一些更改即可解决问题