在尝试重载" +"时,收到错误消息,说我的班级没有命名类型。操作者

时间:2016-08-29 00:30:25

标签: c++ namespaces operator-overloading friend

当我编写了重载operator +的friend函数的定义时,给出错误消息的部分在实现文件中。据说统计学家没有说出一种类型。但它是一个友元函数,写在包含标题的实现文件中,所以我不确定为什么它不能识别这个。另外我意识到我拼写统计数据错误的文件名,但不知道如何轻松地重命名代码块中的文件。

(lldb)

2 个答案:

答案 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