繁体   English   中英

二进制重载operator =

[英]Binary overloaded operator=

所以我正在尝试使用std::ostream_iteratorstd::iostream_iterator来编写和读取文件。 写作过程运作良好,没有任何错误。 但至于阅读,我迷失了。 错误,我有:

1> c:\\ program files(x86)\\ microsoft visual studio 14.0 \\ _vc \\ include \\ xutility(2316):error C2678:binary'=':找不到运算符,它接受类型为'const WRstruct'的左手操作数(或者没有可接受的转换)

它说:

c:\\ users \\ xxxxxxx \\ desktop \\ ttttt \\ ttttt \\ wrstruct.h(21):注意:可能是'WRstruct&WRstruct :: operator =(const WRstruct&)'1> 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;
}

据我所知,函数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注释或删除一行即可消除编译错误。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM