无法访问类中声明的私有成员
Cannot access private member declared in class
我第一次处理运算符重载,并为提取运算符设置重载(<<)。我陷入了两个错误中的一个,这两个错误使我无法继续。代码如下:
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。
相关文章:
- 使用静态成员声明类时遇到问题
- 错误 C2059:语法错误:从结构成员声明'constant'
- std::d eclare_if 或其他在编译时丢弃成员声明的假设方法
- C++ 成员声明中不允许使用限定名称
- 又一个"未找到成员声明"
- auto f = bind(dist<>,gen) 在成员声明C++失败。未被识别为函数
- C++错误:成员声明末尾的预期“;”
- 静态成员声明 c++11
- 如何将成员声明为指向外部"C"函数的指针?
- C++11 - 将非静态数据成员声明为 'auto'
- 类成员声明的快捷方式
- libclang 获取成员声明
- 将成员声明与enable_if一起使用
- 找不到成员声明
- C++错误:找不到成员声明
- 找不到c++成员声明
- 成员声明顺序在类中如果彼此依赖,则为最优解
- 将struct的成员声明为uint32_t时额外的字节
- 为什么类的大小取决于成员声明的顺序?以及如何
- 是成员声明`decltype(name)name;`在第一个名称引用封闭作用域的本地结构中允许