StringStream 연산자 >> 기능으로 실패하지만 인스턴스로 작동합니까?

StackOverflow https://stackoverflow.com/questions/1823073

  •  10-07-2019
  •  | 
  •  

문제

파일에서 int 쌍을 추출하는 간단한 코드를 작성하고 있습니다. 나는 단지 사용하는 기존 코드를 수정하고 있습니다.

string chrom;
unsigned int size;
while ( cin >> chrom >> size ) {
    //  save values
}

그러나 처음 두 열이 동일하지만 다른 데이터 (무시 될 것)가 이어지는 다른 (유사한) 입력 파일을 사용하고 싶습니다. 그래서 나는 다음과 같이 씁니다.

string chrom;
unsigned int size;
string line;
while ( getline(cin, line) ) {
    if( stringstream(line) >> chrom >> size ) {
        // save values
    }
}

그러나 이것은 컴파일에 실패하여 전형적인 외설적 인 STD Lib 템플릿 Spew를 제공합니다.

 error: no match for "operator>>" in "std::basic_stringstream<char, std::char_traits<char>, std::allocator<char> >(((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >&)((const std::basic_string<char, std::char_traits<char>, std::allocator<char> >*)(& line))), std::operator|(_S_out, _S_in)) >> chrom"
istream:131: note: candidates are: std::basic_istream<_CharT, _Traits>& std::basic_istream<_CharT, _Traits>::operator>>(std::basic_istream<_CharT, _Traits>& (*)(std::basic_istream<_CharT, _Traits>&)) [with _CharT = char, _Traits = std::char_traits<char>]
[...another dozen lines...]

오른쪽. 줄은 std :: 문자열이 아니지만 std :: basic_string 등의 일부 변형.

string chrom;
unsigned int size;
string line;
while ( getline(genome, line) ) {
    stringstream ss(line);
    if ( ss >> chrom >> size ) {
       // save values
    }
    // Discard remainder of line
}

왜요? 첫 번째 경우에 무슨 문제가 있습니까? 그만큼 예제 Basic_io 항상 도움이되는 cplusplus.com이 작동하는데 왜 내 코드가 아닌가?

업데이트 : 또 다른 참조 지점 : 임시 스트링 스트림은 추출 된 첫 번째 값이 문자열 대신 int 일 때 작동합니다.

unsigned int chrom;  // works as int...
unsigned int size;
string line;
while ( getline(cin, line) ) {
    if( stringstream(line) >> chrom >> size ) {
        // save values
    }
}
도움이 되었습니까?

해결책

세 가지 회원 기능 그룹과 1 개의 글로벌 기능 그룹 이이 "추출 연산자"(>>)를 과부하 시키십시오. http://www.cplusplus.com/reference/istream/istream/operator%3E%3E/.

  • StringStream (라인); -임시 대상을 만들었습니다
  • stringstream ss (line);- 일반적인 물체.

"Chrom"이 int 인 경우 연산자 >>는 회원 함수 인 산술 추출기로 과부하됩니다. 정상적인 물체 또는 임시 물체는 모두 잘 작동합니다.

"Chrom"이 문자열 인 경우 연산자 >>는 다음과 같이 과부하되어야합니다. istream& operator>> (istream& is, char* str), 이것은 객체 참조를 매개 변수로 취해야하는 글로벌 함수입니다. 그러나 임시 객체가 주어지면 표준 C ++에서 비정상적인 참조로 임시 객체를 전달할 수 없습니다. 오버로드 함수는 과부하 함수가 istream& operator>> (const istream& is, char* str). 불행히도, 그것은 사실이 아닙니다. 임시 오브젝트 케이스에서는 기능을 과부하 할 수 없으므로 다음과 같은 오류를 제공합니다. error: no match for function...

다른 팁

John Weldon의 답변을 확장하기 위해 Extrace Operator ">>" "두 가지를 수행합니다.

  1. 다음 값을 추출하여 연산자 오른쪽의 변수에 배치합니다.
  2. 왼쪽의 스트림의 현재 위치를 증가시킵니다.

따라서 왼쪽과 오른쪽 피연산자를 모두 수정합니다. 귀하의 경우 왼쪽 오페라는 일시적인 값이며 컴파일러는이를 수정하는 데 눈을 and습니다.

C 및 C ++의 일부 연산자는 연산자 왼쪽의 값이 LValue, 즉 수정 될 수 있어야합니다.

여기 더 완전한 설명입니다.

StringStream에서 추출 된 첫 번째 값은 std :: string이기 때문입니다. int라면 StringStream (line) 버전이 작동합니다.

std :: string 용으로 stringstream에 멤버 기능 연산자가 없습니다. 따라서 임시 스트림은 LValue로 작동 할 수 없습니다.

나는 위의 것을 완전히 이해하지는 못했지만 아마도 그것은 더 나은 대답을위한 출발점 일 것입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top