二进制重载运算符=

时间:2017-06-28 12:59:14

标签: c++ c++11

所以我正在尝试使用std::ostream_iteratorstd::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;
}

1 个答案:

答案 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中注释或删除一行即可摆脱编译错误。