1

我是一个新手 C++ 程序员,在编写代码时遇到了这个错误:

C:\Users\Matt\Desktop\C++ Projects\OperatorOverload\students.h|8|error: non-static reference member 'std::ostream& Student::out', can't use default assignment operator|

错误出现在此头文件的第 8 行:

#ifndef STUDENTS_H 
#define STUDENTS_H

#include <string>
#include <vector>
#include <fstream>

class Student {
private:
  std::string name;
  int credits;
  std::ostream& out;

public:
  // Create a student with the indicated name, currently registered for
  //   no courses and 0 credits
  Student (std::string studentName);

  // get basic info about this student
 std::string getName() const;
  int getCredits() const;

  // Indicate that this student has registered for a course
  // worth this number of credits
  void addCredits (int numCredits);
  void studentPrint(std::ostream& out) const;


};
inline
  std::ostream& operator<< ( std::ostream& out, const Student& b)
  {
      b.studentPrint(out);
      return out;
  }
  bool operator== ( Student n1, const Student&  n2)
  {

      if((n1.getCredits() == n2.getCredits())&&(n1.getName() == n2.getName()))
      {
          return true;
      }
      return false;
  }
  bool operator< (Student n1, const Student& n2)
  {
      if(n1.getCredits() < n2.getCredits()&&(n1.getName() < n2.getName()))
      {
          return true;
      }
      return false;
  }

#endif

问题是我不太确定错误的含义,也不知道如何修复它。有没有人有可能的解决方案?

4

2 回答 2

1

显然,代码的问题std::ostream&在于您班级中的成员。从语义上讲,我怀疑拥有这个成员是否真的有意义。但是,让我们假设您想保留它。有几个含义:

  1. 任何用户定义的构造函数都需要在其成员初始化列表中显式初始化引用。否则编译器将拒绝接受构造函数。
  2. 编译器将无法创建赋值运算符,因为它不知道在分配引用时会发生什么。

错误消息似乎与赋值运算符有关。您可以通过显式定义赋值运算符来解决此问题,例如

Student& Student::operator= (Student const& other) {
    // assign all members necessary here
    return *this;
}

但是,更好的解决方案是删除参考参数。无论如何,您可能都不需要它:存储std::ostream&成员的类很少。大多数情况下,任何流都是短暂的实体,临时用于将对象发送到对象或从中接收对象。

于 2012-11-18T22:40:26.387 回答
0

在您的代码中的某处,您在其中一个Student对象上使用了赋值运算符。但是您没有专门定义赋值运算符,您只是使用编译器生成的运算符。但是当您有引用成员时,编译器生成的赋值运算符不起作用。禁用赋值运算符(通过使其私有或删除它),或使 ostream 成员成为指针,而不是引用。这一切都假设您在课堂上确实需要这个 ostream 对象,我觉得这很可疑。

于 2012-11-18T22:34:10.277 回答