C++ 超载<&书信电报;及>&燃气轮机;对于STL地图:“STL地图”;“无法绑定左值”;

C++ 超载<&书信电报;及>&燃气轮机;对于STL地图:“STL地图”;“无法绑定左值”;,c++,c++11,gcc,stl,C++,C++11,Gcc,Stl,我正在尝试使用fstream将包含自定义对象的STL映射保存到文件中。我使用>操作符重载来完成此操作 #include <iostream> #include <string> #include <map> #include <fstream> #define DELIM '/' struct Point{ public: int x, y; }; //operator overloads for point std::istream&

我正在尝试使用fstream将包含自定义对象的STL映射保存到文件中。我使用>操作符重载来完成此操作

#include <iostream>
#include <string>
#include <map>
#include <fstream>

#define DELIM '/'

struct Point{
public:
    int x, y;
};
//operator overloads for point
std::istream& operator>>(std::istream& is, Point& p){
    std::string input;
    std::getline(is, input, DELIM);
    p.x = std::stoi(input);
    std::getline(is, input, DELIM);
    p.y = std::stoi(input);
    return is;
}
std::ostream& operator<<(std::ostream& os, Point& p){
    os << p.x << DELIM << p.y << DELIM;
    return os;
}

//operator overloads for map<string, point>
std::istream& operator>>(std::istream& is, std::map<std::string, Point>& m){
    std::string input;
    std::getline(is, input, DELIM);
    int map_size = std::stoi(input);
    for(int i = 0; i < map_size; i++){
        std::getline(is, input, DELIM);
        Point p; is >> p;
        m[input] = p;
    }
    return is;
}
std::ostream& operator<<(std::ostream& os, std::map<std::string, Point>& m){
    os << m.size() << DELIM;
    for(const auto& pair : m){
        os << pair.first << DELIM;
        os << pair.second;
    }
    return os;
}


int main(){
    Point p1;
    p1.x = 1; p1.y = 2;
    Point p2;
    p2.x = 100; p2.y = 150;

    std::map<std::string, Point> map;
    map["p1"] = p1;
    map["p2"] = p2;


    return 0;
}
完整错误消息:

test.cpp: In function 'std::ostream& operator<<(std::ostream&, std::map<std::basic_string<char>, Point>&)':
test.cpp:44:14: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
   os << pair.second;
              ^
In file included from c:\mingw\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\iostream:39:0,
                 from test.cpp:1:
c:\mingw\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\ostream:602:5: error:   initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Point]'
     operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
     ^

test.cpp:在函数'std::ostream&operator中,参数传递给重载的


大多数情况下,传递给
操作符的参数现在可以看出我的错误。非常感谢。
g++ test.cpp -o test -std=c++11 -Wall
test.cpp: In function 'std::ostream& operator<<(std::ostream&, std::map<std::basic_string<char>, Point>&)':
test.cpp:44:14: error: cannot bind 'std::ostream {aka std::basic_ostream<char>}' lvalue to 'std::basic_ostream<char>&&'
   os << pair.second;
              ^
In file included from c:\mingw\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\iostream:39:0,
                 from test.cpp:1:
c:\mingw\lib\gcc\x86_64-w64-mingw32\4.8.1\include\c++\ostream:602:5: error:   initializing argument 1 of 'std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits<char>; _Tp = Point]'
     operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x)
     ^
for(const auto& pair : m){
    os << pair.first << DELIM;
    os << pair.second;
}
std::ostream& operator<<(std::ostream& os, const Point& p){
                                           ~~~~~
    os << p.x << DELIM << p.y << DELIM;
    return os;
}
std::ostream& operator<<(std::ostream& os, const Point& p){
std::ostream& operator<<(std::ostream& os, const std::map<std::string, Point>& m){