我第一次使用运算符重载,并且正在为提取运算符(<<)设置重载。我陷入了阻止我继续下去的两个错误之一。代码如下:
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);
}
然后重载正常,但它在我的main函数中不起作用,因为它返回错误:
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 ++编译,都返回错误。
答案 0 :(得分:4)
类定义中的声明应该是:
friend ostream &operator<< (ostream &output, const Distance &d1);
// ^--- important
第一次尝试时的错误是因为当你编写一个函数ostream &operator<< (ostream &output, const Distance &d1)
时,这与你所拥有的函数不同,因为它有不同的参数。
第二次尝试应该有各种错误,因为不允许按值传递ostream。