为什么此C ++ STL代码编译失败

时间:2019-08-29 04:14:21

标签: c++

  

编译错误

     

/ usr / include / c ++ / 7 / bits / stream_iterator.h:199:13:错误:没有匹配项   ‘operator <<’(操作数类型为‘std :: ostream_iterator>> :: ostream_type {aka   std :: basic_ostream}”和“ const std :: pair>”)

我没有解决这个问题。 我尝试以多种方式修复这段代码, 地图和配对中的配对方式

pair<int, string >
pair<int, string &>
pair<int, char *>

错误打印对我来说很复杂

#include <iostream>
#include <iterator>
#include <string>
#include <map>
using namespace std;
int main(int argc, char **argv[])
{
map<int, string> science {{101,"physics"},{102,"chemistry"}};

auto itrt = ostream_iterator<pair<int, string > >(cout, ",");

copy(science.begin(), science.end(),itrt);
return 1;
}

预期结果:- 101物理,102化学,

2 个答案:

答案 0 :(得分:4)

您可以使用

ostream_iterator<pair<int, string > >

仅当您在自己的代码中定义以下重载时

std::ostream& operator<<(std::ostream& out, std::pair<int, std::string> const& p);

标准库不提供这样的重载。

要使其更通用,可以重载:

template <typename T1, typename T2>
std::ostream& operator<<(std::ostream& out, std::pair<T1, T2> const& p);

答案 1 :(得分:0)

我认为这应该有效... (因为copy和ostream_iterator不起作用)

#include <iostream>
#include <iterator>
#include <string>
#include <map>
#include <algorithm>
#include <sstream>
using namespace std;
typedef std::pair<int ,string> PairII;

string to_s(PairII const & pii) {
    stringstream ss;
    ss << pii.first << " " << pii.second ;
    return ss.str();
}
int main()
{
    map<int, string> science {{101,"physics"},{102,"chemistry"}};
    std::transform(science.begin(), science.end(),
    std::ostream_iterator<std::string>(cout, " , "), to_s);

    return 0;
}