我一直在处理istream运算符中的for循环问题,我不明白为什么它找不到>>运算符。
错误C2679二进制'>>':未找到采用'结果'类型的右侧操作数的运算符(或没有可接受的转换)
任何帮助都会令人感激。
#include "pch.h"
#include <iostream>
#include <fstream>
#include "Unit.h"
#include "Registration.h"
istream & operator >>(istream & input, Unit & U);
ostream & operator <<(ostream & os, const Unit & U);
istream & operator >>(istream & input, Result & Re);
ostream & operator <<(ostream & os, const Result & Re);
istream & operator >>(istream & input, Date & D);
ostream & operator <<(ostream & os, const Date & D);
int main()
{
std::cout << "Hello World!\n";
ifstream infile("rinput.txt");
if (!infile)
{
return -1;
}
Registration R;
infile >> R;
ofstream ofile("routput.txt");
ofile << R
<< "Number of units = " << R.getCount() << '\n'
<< "Total credits = " << R.GetCredits() << '\n';
infile.close();
ofile.close();
}
#include "Registration.h"
using namespace std;
Registration::Registration()
{
}
istream & operator >>(istream & input, Registration & R)
{
long idTemp;
unsigned semesterTemp, countTemp;
Registration regTemp;
Result tempResult;
input >> idTemp >> semesterTemp >> countTemp;
regTemp.setStudentId(idTemp);
regTemp.setSemester(semesterTemp);
regTemp.setCount(countTemp);
for (unsigned i = 0; i < R.getCount(); i++)
{
//THIS LINE IS THE ERROR
input >> tempResult;
R.setResult(i, tempResult);
}
return input;
}
//result h file has the following
#ifndef RESULT_H
#define RESULT_H
#include "Date.h"
#include "Unit.h"
class Result
{
public:
Result();
float getMark() const;
void setMark(float mrk);
int GetCredits() const;
const Date & getDate() const;
void setDate(const Date &D);
const Unit & getUnit() const;
void setUnit(const Unit &U);
private:
float mark;
Date dateObject;
Unit unitObject;
};
#endif // !RESULT_H
这是错误:
Severity Code Description Project File Line Suppression State
Error C2679 binary '>>': no operator found which takes a right-hand operand of type 'Result' (or there is no acceptable conversion)
在结果内部引用的每个类还具有重载的输入流功能。
答案 0 :(得分:1)
C ++实际上并没有“源”或“头”文件,它仅处理translation units。
简而言之,翻译单元是包含所有包含的头文件的单个源文件。最重要的是,翻译单位是其自己的独立单位,无需其他翻译单位的知识。
这意味着放在一个翻译单元(源文件)中的声明现在将由另一个翻译单元知道。
要使链接到最终可执行程序的所有翻译单元都知道声明,您应该将它们放在头文件中,该文件应包含在所有需要的地方。
示例:
头文件result.h
:
#ifndef RESULT_H
#define RESULT_H
class Result
{
// ...
};
std::istream & operator >>(std::istream & input, Result & C);
std::ostream & operator <<(std::ostream & os, const Result & C);
#endif
“主”源文件main.cpp
:
#include <iostream>
#include "result.h" // "Import" the `operator>>` declaration
int main()
{
Result result;
std::cin >> result;
}
“结果”类实现源文件result.cpp
#include <iostream>
#include "result.h"
// Result class implementation...
std::istream & operator >>(std::istream & input, Result & C)
{
// Read input...
return input;
}
构建以上示例时,您将两个源文件分别构建为两个单独的翻译单元。每个翻译单元的结果是一个目标文件。然后,将这两个目标文件链接到可执行文件中。
答案 1 :(得分:1)
这是一个简单的例子
namespace Me {
class A
{
// bla
};
std::ostream& operator<<(std::ostream& os, A& const& obj)
{
// print in terms of public interface of A
// (else, deckare this a friend function inside A)
return os;
}
} // Me
int main()
{
std::cout << A(); // operator<<(ostream&, A const&) is the best match
}