实现提取和插入运算符 C++

Implementing the extraction and insertion operator C++

我有一个基本的 Student class(必须是 class)(是的,没有封装和命名空间污染,请原谅)我想创建自定义提取和插入运算符.找了无数遍还是不行。我有的是这个

#ifndef student
#define student

#include <iostream>
#include <string>

using namespace std;

class Student
{
    public:
        string name;
        double score;

        Student();
        Student(string name, double score) : name(name), score(score) {}

        friend ostream& operator<<(ostream &out, Student &student);
        friend istream& operator>>(istream &in, Student &student);
};

#endif

#include "student.h"

ostream& operator<<(ostream &out, Student &student)
{
    out << student.name << ", " << student.score;
    return out;
}

istream& operator>>(istream &in, Student &student)
{
    if (!in >> name || !in >> score)
    {
        in.setstate(ios::failbit);
    }
    return in;
}

我已经尝试了很多东西,从 this->name 到 Student::name 到 name 到 Student::student.name 到更改实际上最终起作用的函数签名,只是它实际上并没有使运算符过载.请停止:D

编辑:至于具体问题,就是在方法中访问Studentclass的成员。 student.name 和 student.score 正在抛出

expected primary-expression before '.' token

底部的一个只是向它抛出不同解决方案的遗迹,但它是范围错误。

Edit2:问题原来是在 header 中与守卫发生冲突被称为学生,因此 pre-processor 会在任何地方用核武器这个词学生 -_- 感谢帮助

我发现你的 >>

有一些问题
if (!in >> name || !in >> score)

!优先级高于>>,使用!(in >> student.name)

使用student.name和student.score

就像您在前面的运算符中所做的那样。

<< 运算符的第二个参数使用常量引用很有用。相应地更改好友声明。

评论和长颈鹿船长的回答都指出了各种问题。另一个更关键的问题是:

您在函数中声明了一个名为 student 的变量;但是你的头球实际上 #defines student 在头球后卫中!所以你的 #defined 符号与你的变量名冲突,导致你看到的错误。 header guard 的推荐语法类似于

#define STUDENT_H_INCLUDED