当我编写了重载operator +的friend函数的定义时,给出错误消息的部分在实现文件中。据说统计学家没有说出一种类型。但它是一个友元函数,写在包含标题的实现文件中,所以我不确定为什么它不能识别这个。另外我意识到我拼写统计数据错误的文件名,但不知道如何轻松地重命名代码块中的文件。
(lldb)
答案 0 :(得分:0)
您必须写出Statistician
类的全名,如下所示:
GREGORY_STOCKER_STATICTICIAN::Statistician operator +(const
GREGORY_STOCKER_STATICTICIAN::Statistician &s1,const
GREGORY_STOCKER_STATICTICIAN::Statistician &s2)
{
//....
}
此外,你不应该拥有那么长的名称空间名称,因为它真的很冗长(容易出现错别字),它鼓励using
语句,鼓励基于命名冲突的错误。 2使用代码语句如下所示:
using GREGORY_STOCKER_STATICTICIAN::Statistician;
哪个比替代方案更好:
using GREGORY_STOCKER_STATICTICIAN;
此外,虽然您没有提及此错误,但您的if... else
块需要大括号,如下所示:
if(s1. largest > s2.largest)
s3.largest = s1.largest;
else
{
s3.smallest = s2.smallest;
if(s1. smallest < s2.smallest)
s3.smallest = s1.smallest;
else
s3.smallest = s2.smallest;
}
在您之前的代码中,此代码将在块之外进行评估,我认为您并不想要,即使这里没有任何区别。作为建议,为了可维护性,总是使用if...else
块的大括号。
此外,由于您创建了operator+
友元函数,因此它仅限于命名空间中的最小块范围。使operator+
成为实际的成员函数,而不是朋友,所以看起来像这样:
Statistician operator+(const s1& other)
{
Statistician s3;
s3.sum = (s1.sum + this->sum);
s3.sequence_length = (s1.sequence_length + this->sequence_length;
if(s1.largest > largest)
s3.largest = s1.largest;
else
s3.smallest = this->smallest;
if(s1.smallest < this->smallest)
s3.smallest = s1.smallest;
else
s3.smallest = this->smallest;
s3.last = s2.last;
return s3;
}
此外,不需要明确使用this->
,我只是明确表示变量是从当前对象中获取的。
答案 1 :(得分:0)
类中的friend
声明,在最小的封闭命名空间中声明该函数。因此,您的friend
声明实际上已声明,而朋友GREGORY_STOCKER_STATICTICIAN::operator +
。它没有宣布也不是朋友::operator +
。
但是您的代码尝试在命名空间之外实现::operator +
。这使得一个完全不同的功能:尝试将两个统计员一起添加的任何代码都找不到它,因为该代码只能找到命名空间版本。此外,它甚至没有编译(因为你在Arnav Borborah的答案下发布了错误消息):由于::operator +
不是friend
,它无法访问私人成员。
所以最简单的解决方案实际上是将operator+
定义放在命名空间中,以便它与声明匹配:
namespace GREGORY_STOCKER_STATICTICIAN
{
Statistician operator +(const Statistician &s1,const Statistician &s2)
{
// ...
}
}
现在您也不需要限定Statistician
。