2

我查找了有关重载 << 运算符的信息,似乎我做的一切都正确,但我不断收到编译错误。我已经在我的头文件中添加了这个函数,并在我的 cpp 文件的顶部放置了一个原型。

我的大学.h:

#ifndef UNIVERSITY_H
#define UNIVERSITY_H

#include <string>
#include <vector>
#include <iostream>

using namespace std;

#include "Department.h"
#include "Student.h"
#include "Course.h"
#include "Faculty.h"
#include "Person.h"


class University
{
  friend ostream& operator<< (ostream& os, const vector<Department>& D);
  friend ostream& operator<< (ostream& os, const Department& department);

 protected:
  vector<Department> Departments;
  vector<Student> Students;
  vector<Course> Courses;
  vector<Faculty> Faculties;
  static bool failure;
  static bool success;


 public:

  bool CreateNewDepartment(string dName, string dLocation, long dChairID);
  bool ValidFaculty(long dChairID);
};

#endif

我的大学.cpp:

#ifndef UNIVERSITY_CPP
#define UNIVERSITY_CPP

#include<string>
#include<vector>
#include<iostream>
using namespace std;

#include "University.h"

ostream& operator<<(ostream& os, const vector<Department>& D);
ostream& operator<<(ostream& os, const Department& department);

bool University::failure = false;
bool University::success = true;


bool University::CreateNewDepartment(string dName, string dLocation, long dChairID)
{
  if((dChairID != 0) && (ValidFaculty(dChairID)== University::failure))
    {
      Department D(dName, dLocation, dChairID);
      Departments.push_back(D);
      for (int i = 0; i < Departments.size(); i++)
         cout << Departments;
      return University::success;
    }
  return University::failure;
}

bool University::ValidFaculty(long dChairID)
{
  for (int i = 0; i < Faculties.size(); i++)
    {
      if (Faculties[i].ID == dChairID)
        return University::success;
    }
  return University::failure;
}

ostream& operator<<(ostream& os, const vector<Department>& D)
{
  for (int i = 0; i < D.size(); i++)
     os << D[i] << endl;
  os << "\n";
  return os;
}

ostream& operator<< (ostream& os, const Department& department)
{
    department.Print(os);
    return os;
}

#endif

我的部门.h:

#ifndef DEPARTMENT_H
#define DEPARTMENT_H

#include<vector>
#include<string>
#include<iostream>
using namespace std;

class Department
{
  friend class University;
  friend ostream& operator<< (ostream& os, Department& department);

 protected:
  long ID;
  string name;
  string location;
  long chairID;
  static long nextDepartID;

 public:
  Department();
  Department(string dName, string dLocation, long dChairID);
  void Get();
  void Print(ostream& os)const;
};

#endif

我的部门.cpp:

#ifndef DEPARTMENT_CPP
#define DEPARTMENT_CPP

#include<iostream>
#include<string>
using namespace std;

#include "Department.h"

long Department::nextDepartID = 100;

Department::Department()
{
  ID = nextDepartID++;
  name = "Null";
  location = "Null";
  chairID = 0;
}

Department::Department(string dName, string dLocation, long dChairID):name(dName), location(dLocation), chairID(dChairID)
{
  ID = nextDepartID++;
}

void Department::Get()
{
}

void Department::Print(ostream& os)const
{
  os << "\n";
  os << ID << endl;
  os << name << endl;
  os << location << endl;
  os << chairID << endl;
  os <<"\n\n";
}

ostream& operator<< (ostream& os, const Department& department)
{
  department.Print(os);
  return os;
}
#endif

现在可以看到仅与此问题有关的所有内容。我现在收到的唯一错误是 void 值没有被忽略。

错误片段:

University.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Department&)’:
University.cpp:53: error: void value not ignored as it ought to be
Department.cpp: In function ‘std::ostream& operator<<(std::ostream&, const Department&)’:
Department.cpp:42: error: void value not ignored as it ought to be

最终编辑:

感谢所有帮助过我的人。我现在肯定对运算符重载有了更好的理解……尤其是当它处理打印用户定义类型的向量时!

4

1 回答 1

4

抱怨是,虽然您的迭代和打印向量内容的函数可能是正确的,但向量包含的实际对象没有operator<<指定。

你需要有一个。

如果你已经Print()在你的类中调用了一个方法,你可以简单地为如下Department创建一个重载:operator<<

std::ostream& operator<<(std::ostream& os, const Department& department) {
    os<<department.Print();
    return os;
}

在您发布更新之前,我已经准备了以下代码。也许它可以帮助你。

#include<iostream>
#include<vector>
#include<string>

class Department {
 public:
  Department(const std::string& name)
      : m_name(name) { }
  std::string name() const {
    return m_name;
  }
 private:
  std::string m_name;  
};


// If you were to comment this function, you would receive the
// complaint that there is no operator<< defined.
std::ostream& operator<<(std::ostream& os, const Department& department) {
  os<<"Department(\""<<department.name()<<"\")";
  return os;
}

// This is a simple implementation of a method that will print the
// contents of a vector of arbitrary type (not only vectors, actually:
// any container that supports the range-based iteration): it requires
// C++11.
template<typename T>
void show(const T& container) {
  for(const auto& item : container) {
    std::cout<<item<<std::endl;
  }
}

int main() {
  std::vector<Department> deps = {{"Health"}, {"Defense"}, {"Education"}};
  show(deps);
}

编译g++ example.cpp -std=c++11 -Wall -Wextra(我使用 OS X 10.7.4 和 GCC 4.8.1)得到:

$ ./a.out 
Department("Health")
Department("Defense")
Department("Education")
于 2013-11-08T03:40:34.823 回答