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 に答える