我有一个基本的Student类(必须是一个类)(是的,没有封装和名称空间污染请原谅),我想创建自定义提取和插入操作符。经过无数次搜索后,它仍然无效。我拥有的是这个
#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-&gt; name到Student :: name来命名为Student :: student.name来改变实际上最终工作的函数签名,除了它实际上没有重载运算符。请停止:D
编辑:至于具体问题,它是在方法中访问Student类的成员。 student.name和student.score正在抛出
expected primary-expression before '.' token
而底部只是一个抛出不同解决方案的遗物,但它的范围错误。
Edit2:问题结果是与标题中的后卫被称为学生发生冲突,因此预处理器会在任何地方将“学生”这个词搞得一团糟-_- 谢谢你的帮助
答案 0 :(得分:4)
在评论和长颈鹿船长的回答中已经指出了各种问题。另一个更关键的问题是:
在函数中声明一个名为student
的变量;但是你的标题实际上是#define
s student
在标题后卫!因此,您的#define
d符号会与您的变量名称冲突,从而导致您看到的错误。标题保护的推荐语法类似于
#define STUDENT_H_INCLUDED
答案 1 :(得分:3)
我发现您的>>
if (!in >> name || !in >> score)
!优先级高于&gt;&gt;,请使用!(在&gt;&gt; student.name)
使用student.name和student.score
正如您在之前的运营商中所做的那样。
对<<
运算符的第二个参数使用const引用很有用。相应地更改好友声明。