4

<< 演算子をオーバーロードするのに本当に苦労しています。コードの特定の部分のみを変更できる宿題に取り組んでいます。あなたが尋ねる前に、私はクラスの代わりに構造体を使用して立ち往生しています。影響を受けるコードの一部は次のとおりです。

呼び出し関数は次のとおりです。

/*
 * Write a CSV report listing each course and its enrollment.
 */
void generateReport (ostream& reportFile,
             int numCourses,
             Course* courses)
{
  for (int i = 0; i < numCourses; ++i)
    {
        //courses is an array of "Course" structs
        reportFile << courses[i] << endl;
    }
}

.h ファイルは次のとおりです。

#ifndef COURSE_H
#define COURSE_H

#include <iostream>
#include <string>


struct Course {
    std::string name;
    int maxEnrollment;
    int enrollment;

    Course();
    Course(std::string cName);

    std::ostream& operator << (ostream &out, const Course &c);
};

#endif

.cpp ファイルは次のとおりです。

#include "course.h"

using namespace std;


Course::Course()
{
    name = "";
    maxEnrollment = 0;
    enrollment = 0;
}

Course::Course(string cName)
{
    name = cName;
    maxEnrollment = 0;
    enrollment = 0;
}

// send course to file
ostream& Course::operator << (ostream &out, const Course &c)
{
    out << c.name << "," << c.enrollment << endl;
    return out;
}

これが私が得続けるエラーメッセージです:

エラー: 'operator<<' を非関数として宣言 |

私は何時間もインターネットを検索してきましたが、この問題を解決するためにさまざまなアプローチを試みましたが、成功しませんでした. 助けてください!!

アドバイスに基づいてこれを修正するために、いくつかの異なる方法を試しました。私が試した 2 つの方法を次に示しますが、うまくいきませんでした: 方法 1:

#ifndef COURSE_H
#define COURSE_H

#include <iostream>
#include <string>


struct Course {
    std::string name;
    int maxEnrollment;
    int enrollment;

    Course();
    Course(std::string cName);

};

//Moved this outside the struct
std::ostream& operator << (ostream &out, const Course &c);

#endif

方法 2 (エラーの変更にも失敗しました):

#include "course.h"

using namespace std;


Course::Course()
{
    name = "";
    maxEnrollment = 0;
    enrollment = 0;
}

Course::Course(string cName)
{
    name = cName;
    maxEnrollment = 0;
    enrollment = 0;
}

std::ostream& operator << (ostream &out, const Course &c);


// send course to file
ostream& Course::operator << (ostream &out, const Course &c)
{
    out << c.name << "," << c.enrollment << endl;
    return out;
}

再編集----------------------------------------------- --------- いくつかのコメントとヘルプの後、ここに私の現在のコードがあります:

.h ファイル内:

#ifndef COURSE_H
#define COURSE_H

#include <iostream>
#include <string>


struct Course {
    std::string name;
    int maxEnrollment;
    int enrollment;

    Course();
    Course(std::string cName);

    std::ostream& operator << (std::ostream &out, const Course &c);
};

#endif

.cpp ファイル内:

#include "course.h"

using namespace std;

Course::Course()
{
    name = "";
    maxEnrollment = 0;
    enrollment = 0;
}

Course::Course(string cName)
{
    name = cName;
    maxEnrollment = 0;
    enrollment = 0;
}


// send course to file
ostream& operator << (ostream &out, const Course &c)
{
    out << c.name << "," << c.enrollment << endl;
    return out;
}
4

3 に答える 3

3
std::ostream& operator << (std::ostream &out, const Course &c);

する必要があります

friend std::ostream& operator << (std::ostream &out, const Course &c);

std::ostream& Course::operator << (std::ostream &out, const Course &c)   // Not a member of Course
{

する必要があります

std::ostream& operator << (std::ostream &out, const Course &c)
{

のメンバーではないためCourse

于 2013-03-31T20:15:04.580 に答える