VS2015友元函数重载操作运算符无法访问私有成员

问题是在看C++primer plus 私有继承部分出现的,按照书上的代码,在VS2015中发现编译不通过,提示为无法访问类的私有成员,该错误是在重载>>运算符时出现的,而其他友元函数访问私有成员未出现错误。

解决方法:将>>运算符的定义放在类声明中进行,如下:

#ifndef STUDENTC_H_
#define STUDENTC_H_
#include <iostream>
#include <valarray>
#include <string>

class Student :private std::string, private std::valarray<double>
{
private:
	typedef std::valarray<double> ArrayDb;
	//private method for scores output
	std::ostream & arr_out(std::ostream & os) const;
public:
	Student() :std::string("Null Student"), ArrayDb() {}
	explicit Student(const std::string & s):std::string(s),ArrayDb(){}
	explicit Student(int n): std::string("Nully"),ArrayDb(n){}
	Student(const std::string & s,int n):std::string(s),ArrayDb(n){}
	Student(const char * str, const ArrayDb & a) :std::string(str), ArrayDb(a) {}
	Student(const char * str,const double * pd, int n):std::string(str),ArrayDb(pd,n){}
	~Student(){}
	double Average() const;
	double & operator[](int i);
	double operator[](int i) const;
	const std::string & Name() const;
	//friends
		//input
	friend std::istream & operator >> (std::istream & is, Student & stu);
	friend std::istream & getline(std::istream & is, Student & stu);
	//out put(就是这个有问题)
	friend std::ostream & operator<<(std::ostream & os, Student & stu)
	{
		os << "Scores for " << (const std::string &)stu << ":\n";
		stu.arr_out(os);
		return os;
	}
};

#endif
另外将studenti.cpp中的相应定义去掉,就可以编译通过,且运行正常。

看网上其他大佬解释说这是vs的编译器有问题= =   在此不深究。

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值