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的编译器有问题= =   在此不深究。

©️2020 CSDN 皮肤主题: 编程工作室 设计师:CSDN官方博客 返回首页