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