Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/github/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 重载运算符时出错=_C++_Operator Overloading - Fatal编程技术网

C++ 重载运算符时出错=

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

Iv构建一个名为layerOneTree的红黑树,现在我想为它重载operator=,但我不知道语法

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
}