无法访问类中声明的私有成员

Cannot access private member declared in class

本文关键字:成员 声明 访问      更新时间:2023-10-16

我第一次处理运算符重载,并为提取运算符设置重载(<<)。我陷入了两个错误中的一个,这两个错误使我无法继续。代码如下:

ostream &operator << (ostream &output, const Distance &d1)
{
    if (d1.miles > 0)
    {
        output << d1.miles << "m ";
    }    
    if (d1.yards > 0)
    {
        output << d1.yards << "y ";
    }
    if (d1.feet > 0)
    {
        output << d1.feet << "' ";
    }
    output << d1.inches << """;
    return (output);
}

重载在头文件中声明为友元,如下所示:

friend ostream &operator<< (ostream output, const Distance &d1);

我遇到的第一个问题是,当重载以这种方式格式化时(据我所知,这是正确的方式),它不允许我访问英里、码、英尺或英寸成员数据,尽管该函数在头文件中设置为朋友。

如果我将过载更改为:

ostream &operator << (ostream output, const Distance &d1)
{
    if (d1.miles > 0)
    {
        output << d1.miles << "m ";
    }    
    if (d1.yards > 0)
    {
        output << d1.yards << "y ";
    }
    if (d1.feet > 0)
    {
        output << d1.feet << "' ";
    }
    output << d1.inches << """;
    return (output);
}

然后过载正常工作,但它在我的主函数中不起作用,因为它返回错误:

error C2248: 'std::basic_ostream<_Elem,_Traits>::basic_ostream' : cannot access private member declared in class 'std::basic_ostream<_Elem,_Traits>'

对于函数中的每个cout实例。另外,我前面的例子表明这是不正确的。在第一个阻止我访问私人成员数据的代码示例中,我做错了什么?我已经在不同的网站上看到了其他几个这样的例子,但没有什么能与我得到的完全匹配。我尝试过使用Visual Studio Express 2012和g++进行编译,但都返回了错误。

类定义中的声明应该是:

friend ostream &operator<< (ostream &output, const Distance &d1);
//                                  ^--- important

第一次尝试时出现的错误是,当您编写函数ostream &operator<< (ostream &output, const Distance &d1)时,它与您所推荐的函数不同,因为它有不同的参数。

第二次尝试应该有各种错误,因为不允许按值传递ostream。