2017-10-23 2 views
1

난의 입력을 그러나 이것은 컴파일되지 않습니다 : error: no match for 'operator>>', 아마도 연산자 오버로딩이 필요하기 때문입니다.STL 복사, 한 쌍의 벡터 및 삽입

그게 내 std::vector에서 inhertis 내 클래스를 만들고 연산자를 오버로드해야한다는 뜻입니까?

표준 벡터 클래스 대신 내 자신의 클래스를 사용하지 않는 것이 좋습니다.

+0

/ATHMY25752) – P0W

+0

Oh @ P0W, 반복기 문제가 아니라 벡터가 보입니다! – gsamaras

+0

Nah 나는'std' 네임 스페이스에서/제안하는 것을 주저합니다. 조금 더 노력할 필요가있는 더 나은 대안이 있습니다. – P0W

답변

2

문제는 std::vector이 아니며, std::istream_iterator입니다. 그 이유는 std::pair에는 역 직렬화 연산자가 정의되어 있지 않기 때문입니다.

여전히 std::vectorstd::back_insert_iterator을 사용할 수 있지만 직접 입력 반복기를 정의해야합니다. 한 쌍의 값을 읽습니다.

어떤 사람들은 자신의 쌍에 operator>>을 정의 할 것을 제안 할 수도 있지만 이는 신뢰할 수없는 기술입니다. <algorithm><iterator>을 포함하기 전에 정의되는 연산자에 따라 다릅니다.

+0

아하, +1! 마지막 단락을 설명해 주시겠습니까? – gsamaras

+1

@gsamaras - [이유가 여기에 있습니다.] (https://stackoverflow.com/questions/46811833/why-does-stdlesseigenvectorxd-fail-to-compile/46812491#46812491). 귀하의 게시물에 대한 의견에서 제공 한 코드가 namesapce std를 다시 엽니 다. 새로운 기능에 대한 정의를 추가 할 수는 없습니다. UB 야. – StoryTeller

1

프록시 객체를 통해 복사 할 수 있습니다 :

당신은 <<`한 쌍의 [이있을 수 있습니다처럼] (http://rextester.com을 읽는`에 대한 자신의 구현을 정의 할 필요가
#include <vector> 
#include <iterator> 
#include <algorithm> 
#include <iostream> 

struct proxy 
{ 
    friend auto operator>>(std::istream& is, proxy& prox) -> std::istream& 
    { 
     is >> std::get<0>(prox.target); 
     is >> std::get<1>(prox.target); 
     return is; 
    } 

    operator std::pair<int, char>() const { 
     return target; 
    } 

    std::pair<int, char> target; 
}; 

int main(void) { 
    std::vector<std::pair<int, char>> v; 
    std::copy(std::istream_iterator<proxy>(std::cin), 
       std::istream_iterator<proxy>(), 
       std::back_inserter(v)); 
    for(auto pair: v) 
     std::cout << pair.first << std::endl; 
    return 0; 
} 
+0

좋은 답변입니다. 그것이 과부하되어야한다는 것에 대한 제 인상이 잘못되었다고 말하면 받아 들일 것입니다 (iterator가 아니라 vector입니다). 따라서 수용된 대답은 간결합니다. – gsamaras