所以我正在尝试使用std::ostream_iterator
和std::iostream_iterator
来编写和读取文件。写作过程运作良好,没有任何错误。但至于阅读,我迷失了。错误,我有:
1> c:\ program files(x86)\ microsoft visual studio 14.0 \ _vc \ include \ xutility(2316):错误C2678:binary'=':找不到运算符,它采用类型为'const的左手操作数WRstruct'(或没有可接受的转换)
它说:
c:\ users \ xxxxxxx \ desktop \ ttttt \ ttttt \ wrstruct.h(21):注意:可能是'WRstruct& WRstruct :: operator =(const WRstruct&)' 1 GT; c:\ program files(x86)\ microsoft visual studio 14.0 \ _vc \ include \ xutility(2316):注意:尝试匹配参数列表'(const WRstruct,WRstruct)'
重载operator=
的正确方法是什么?
类:
#include <iostream>
#include <string>
#include <fstream>
#include <vector>
#include <iterator>
#include <istream>
class WRstruct
{
private:
std::string name;
std::string number;
friend std::ostream& operator<<(std::ostream&, const WRstruct&);
friend std::istream& operator >> ( std::istream& is, WRstruct&);
public:
WRstruct(){};
void write();
void read();
~WRstruct(){};
};
std::ostream& operator<<(std::ostream& os, const WRstruct& p)
{
os << "User Name: " << p.name << std::endl
<< "Name: " << p.number << std::endl
<< std::endl;
return os;
}
std::istream& operator >> (std::istream& is, WRstruct& p)
{
is >> p.name>>p.number;
return is;
}
方法:
void WRstruct::write()
{
std::vector<WRstruct> vecP;
std::copy(std::istream_iterator<WRstruct>(std::cin),
std::istream_iterator<WRstruct>(), std::back_inserter(vecP));
std::ofstream temp("temp.txt", std::ios::out);
std::ostream_iterator<WRstruct>temp_itr(temp, "\n");
std::copy(vecP.begin(), vecP.end(), temp_itr);
}
void WRstruct::read()
{
std::vector<WRstruct> vec;
std::ifstream readFile("temp.txt");
std::istream_iterator<WRstruct> istr(readFile);
copy(vec.begin(), vec.end(), istr);
std::istream_iterator<WRstruct> end_istr;
copy(istr, end_istr, back_inserter(vec));
std::ostream_iterator<WRstruct> osIter(std::cout," ");
copy(vec.begin(),vec.end(),osIter);
}
和main():
#include <iostream>
#include "WRstruct.h"
int main()
{
WRstruct r;
r.write();
//r.read();
return 0;
}
答案 0 :(得分:2)
据我所知,函数WRstruct::read
的含义是“从'temp.txt'读取所有数据并将其写入控制台”。 顺便说一句,奇怪的是函数read
会输出一些东西,所以请考虑相应地命名你的函数。
要使用istream_iterator
从文件中读取内容,您应该创建一对迭代器(一个指向文件的开头,另一个指向空)并使用std::copy
。因此,函数的读取部分应该看起来像
std::vector<WRstruct> vec;
std::ifstream readFile("temp.txt");
std::istream_iterator<WRstruct> istr(readFile);
std::istream_iterator<WRstruct> end_istr;
copy(istr, end_istr, back_inserter(vec));
因此,您只需在WRstruct::read
中注释或删除一行即可摆脱编译错误。