std :: istream_iterator不适用于std :: pair

时间:2018-09-28 13:56:20

标签: c++ stl g++ std-pair istream-iterator

简单的例子。此代码无法编译:

#include <iostream>
#include <iterator>

using test_t = std::pair<int, int>;

std::istream& operator>>(std::istream& in, test_t& t) {
    return in >> t.first >> t.second;
}

int main() {
    auto it = std::istream_iterator<test_t>(std::cin);
}

编译日志包含大量替换错误,并以

开头
/usr/include/c++/8.2.1/bits/stream_iterator.h:121:17: error: no match for 'operator>>' (operand types are 'std::istream_iterator<std::pair<int, int> >::istream_type' {aka 'std::basic_istream<char>'} and 'std::pair<int, int>')
      *_M_stream >> _M_value;

但是如果我将test_t更改为这样的结构:

#include <iostream>
#include <iterator>

struct test_t {
    int first;
    int second;
};

std::istream& operator>>(std::istream& in, test_t& t) {
    return in >> t.first >> t.second;
}

int main() {
    auto it = std::istream_iterator<test_t>(std::cin);
}

它可以编译。 或者,如果我保留std :: pair,但是直接从std :: cin调用operator >>,它也可以正常工作:

#include <iostream>
#include <iterator>

using test_t = std::pair<int, int>;

std::istream& operator>>(std::istream& in, test_t& t) {
    return in >> t.first >> t.second;
}

int main() {
    test_t t;
    std::cin >> t;
}

有人知道为什么会这样吗?还是仅仅是编译器中的错误?

顺便说一句,编译器是g ++(GCC)8.2.1

0 个答案:

没有答案