C++ 重载运算符时出错=
Iv构建一个名为layerOneTree的红黑树,现在我想为它重载operator=,但我不知道语法C++ 重载运算符时出错=,c++,operator-overloading,C++,Operator Overloading,Iv构建一个名为layerOneTree的红黑树,现在我想为它重载operator=,但我不知道语法 const layerOneTree& operator =(const layerOneTree &rhs); //in layerOneTree.h 实施: layerOneTree& layerOneTree::operator= (const layerOneTree &rhs)//ERROR { if (this != &rhs) // if
const layerOneTree& operator =(const layerOneTree &rhs); //in layerOneTree.h
实施:
layerOneTree& layerOneTree::operator= (const layerOneTree &rhs)//ERROR
{
if (this != &rhs) // if not self assignment
{
reclaimMemory(m_root->rChildPtr); // clear its memory
m_root->rChildPtr = theLeaf;
m_root->rChildPtr = clone(rhs.m_root->rChildPtr);
}
return *this; // return current tree object
}
我知道layerOneTree*layerOneTree::operator=
有问题,但我不知道如何解决
编辑:当我在
const layerOneTree&operator=(const layerOneTree&rhs)中省略const时代码>一切正常,但我试着像这样编写代码。如第43行所示,定义为常量。为什么该代码有效而我的代码无效?成员函数的定义和声明必须匹配。解决方案是使两者返回相同类型的变量:
const layerOneTree& operator =(const layerOneTree &rhs); //in layerOneTree.h
const layerOneTree& layerOneTree::operator= (const layerOneTree &rhs)
{// Code
}
或:
我更喜欢第二种形式,因为它更简单,更容易理解
两者行为上的差异可以在这里找到:您忘记向我们显示错误消息;但这可能与声明中的返回类型是const
有关,而与定义无关。它不应该是const
。您可能需要执行:layerOneTree::layerOneTree&layerOneTree::operator=(const…)它也可能是const。这些函数定义的问题是我觉得C++最让人恼火的事情之一。我希望他们能把它修好。我有这个问题很多次了。如果你仍然无法修复它,我会破除一些旧的C++代码,找出你做错了什么。你的声明有const返回类型<代码> const LealEnErrE和,而你的定义没有<代码> LayEnEntErE和。@莫诺河:使它们既不是代码> const < /C> >(或那里)也不是“<代码> const < /C>”。这并不重要,只要它们都是相同的。FWIW这不是语法错误(代码的语法很好——语法错误指阻止解析的语法错误),而是代码语义上的错误。也就是说,它解析(因此不是语法错误),但由于两个签名之间的矛盾,对编译器来说没有“意义”,就像您可以构造包含自相矛盾的语法正确的英语参数一样。使用哪个参数很重要,因为它们在链式赋值语句中的行为不同。第二种通常被认为是正确的形式。
layerOneTree& operator =(const layerOneTree &rhs); //in layerOneTree.h
layerOneTree& layerOneTree::operator= (const layerOneTree &rhs)
{// Code
}