2010-07-14 10 views
1

작동합니다 : copy(test.begin(), test.end(), sIt); 작동하도록 operator <<를 오버로드 할 수있는 적절한 방법이 무엇인지연산자 오버로딩 << 다음 코드에서 문자열

using namespace std; 

//ostream& operator<< (ostream& out,const string & str) 
//{  
// out << str.c_str();  
// return out; 
//} 

int _tmain(int argc, _TCHAR* argv[]) 
{ 

    ofstream file("file.out"); 

    vector<string> test(2); 

    test[0] = "str1"; 
    test[1] = "str2"; 
    ostream_iterator<string> sIt(file); 

    copy(test.begin(), test.end(), sIt); 

    file.close(); 
    return 0; 
} 

.

무엇이 누락 되었습니까?

편집 : 나는 그냥 ... 바보는

감사합니다 "문자열"헤더를 포함하는 것을 잊었다!

+0

에 대한 cplusplus.com에서 링크를 추가합니다. –

답변

6

문자열을 처리하기 위해 operator<<을 오버로드 할 필요가 없습니다. 이미 처리 방법을 알고 있습니다.

std::copy(test.begin(), test.end(), 
      std::ostream_iterator<std::string>(file, "\n")); 

를 생성합니다 : 다른 아무것도 당신이 할하려는 특별한/

str1 
str2 

있습니까?

+1

이 연산자는 이미 에 연산자 << 오버로드가 있습니다. – Puppy

+0

나는 어리 석다! 위의 이유가 작동하지 않는 이유는 실제로 재미 있습니다 :) (힌트 : 누락 된 포함) p.s. 바보 같은 질문에 대한 미안 해요 :) – HotHead

2

데이빗은 이미 문자열에 대해 operator<<이 이미 있으므로 제공 할 필요가 없습니다. 어쨌든 자신 만의 과부하를 정의하고 싶다면, 실제로는 그렇게 할 수 없기 때문에 약간의 문제가 있습니다. operator<<std 네임 스페이스에 정의되어 있으므로 std::string (대부분의 구현에서 버전은 템플릿 함수이므로 은 잠재적 인 과부하 일 수 있습니다.) std에서 사용할 수있는 오버로드가 있어야합니다. 네임 스페이스도 마찬가지입니다 (모호성과 오버로드가 C++에서 해결 되었기 때문에 여기에 몇 가지주의 사항이 있습니다). 예를 들면 : 그것은 예측할 수있는 표준 라이브러리 안에 물건의 모든 종류를 깰 수있는 고유의 구현으로 영향을 미칠 수 있기 때문에

namespace std { 
ostream& operator<< (ostream& out,const string & str) 
    {  
    out << "A STRINGY:" << str.c_str();  
    return out; 
    } 
} 

그러나, std 네임 스페이스에 물건을 추가하는 것은, 일반 사용자를 위해 허용되지 않습니다. 또한 표준 라이브러리 구현에 과부하 가능 연산자 인 < <이 있다는 보장은 없습니다. 이것은 작동 할 수도 있고 그렇지 않을 수도 있음을 의미합니다.