NOTICE 
나는 보통
#define NPOS ((string::size_type)-1)

라고 매크로로 사용하는데... 이거 어째서 std에서 정의 안해놓은거지? 내가 못찾은 건가.
2005/10/24 18:21 2005/10/24 18:21
  
트랙백 0  |  댓글 2  |
gcc version 3.2.2 20030222 (Red Hat Linux 3.2.2-5) 에서 발생했음.

...쩝 STL 오류코드 보느라 눈깔빠지는 줄 알았는데..
transform( s1.begin(), s1.end(), s1.begin(), tolower );
이 코드의 경우 VC 에서는 문제없이 돌아가는데 gcc에서는 toupper 인자, 리턴형 문제때문인지

no matching function for call to `transform(
__gnu_cxx::__normal_iterator std::char_traits< char >, std::allocator< char > > >,
__gnu_cxx::__normal_iterator< char*, std::basic_string < char,
std::char_traits< char >, std::allocator< char > > >,
__gnu_cxx::__normal_iterator std::char_traits< char >, std::allocator< char > > >, < unknown type >)'


이딴 썩을 에러코드를 뺃으면서 컴파일이 안된다.
해결방법은
transform( s1.begin(), s1.end(), s1.begin(), (int(*)(int))tolower );
로 수정. 즉 toupper 의 인자와 리턴형을 명시적으로 int형으로 수정해준것이다. 소스코드를 봐봐야 알겠지만 위에서 언급한 컴파일러의 빌트인 펑션 touuper 변수와 리턴형이 아마도 char로 되어있는게 아닌가 싶다.
(...엇...char로 되어있어야 더 잘되야 되는거 아냐?!
...귀찮다...)

냠...어쨋든 메모메모.

ps. 저렇게 해놓는게 올바른 방법인지는 모르겠다.
2005/10/10 21:23 2005/10/10 21:23
[CODE] #include <iostream> #include <algorithm> #include <string> using std::cout; using std::endl; using std::string; using std::transform; int main() { string s = "Yoway Bahamut Lagoona"; transform( s.begin(), s.end(), s.begin(), toupper ); cout<<s<<endl; } [/CODE]

초간단해 뵈지만 저 내용을 찾는데 무려 1시간이 걸렸다 -_-;;
일단 msdn 이나 그런곳에서 찾으면 locale 이란 객체를 사용해서 영문자뿐이아니라 불어,독어 등등의 문자변화예제가 나오는데 토나오게 복잡하다.

[CODE] #include <locale> #include <iostream> using namespace std; int main( ) { locale loc1 ( "German_Germany" ); char *string = "HELLO, MY NAME IS John!"; use_facet<ctype<char> > ( loc1 ).tolower ( &string[0], &string[strlen(&string[0])-1] ); cout << "The lowercase string is: " << string << endl; } [/CODE]

이게 msdn 에 나온 예제... 뭐 자세히 보면 그리 복잡해뵈지도 않지만...문제는 비주얼스튜디오 2002에서 기본적으로 컴파일해서 실행시키면 런타임 오류가 난다. 컴파일 옵션 /EHsc 를 주라고 하는데... 얼마나 찝찝한가! 안그래도 UNIX 포팅때문에 CString 을 없에고 있는 마당인데 뭔가 컴파일 설정 들어가고 그러는 코드를 짜놓으면 후회할것 같다.

locale 에 관련된 내용도 좀 찾아보고 사용해야 되고..
에휴...어쨋거나 메모. STL 사용의 길은 멀고 험하다..

ps. 나중에 locale 관련 참고할 url (http://turboc.borlandforum.com/impboard/impboard.dll?action=read&db=cpp_tip&no=16)
2005/09/16 19:12 2005/09/16 19:12
std::string 을 쓸때 CString 에서 처럼 Format("%d", 100 ) 이런 코드를 작성하지 못해서 좀 난감해 하고 있었는데

[CODE]cout<<100<<"하하"<<endl;[/CODE]
이런 코드를 생각해 볼때
iostream 쪽을 상속받아서 위의 sprintf 같이 문자열을 생성해내는 클래스가 분명히 있을거라 생각해서 이것저것 뒤져보니 stringstream 이라는 클래스가 있었다.
예제 코드는

[CODE] #include <iostream> #include <string> #include <sstream> using std::string; using std::cout; using std::endl; using std::ostream; using std::stringstream; int main() { int interger = 10; double doublevalue = 213.33; string tmp = "yoway"; string str; stringstream stream(stringstream::in | stringstream::out); stream<<interger<<", "<<doublevalue<<", "<<tmp; str = stream.str(); cout<<str<<endl; return 0; } [/CODE]

아마 cout 쓸때 서식지정하는 방법과 동일하게 stringstream 도 사용할수 있을듯...
2005/09/16 13:04 2005/09/16 13:04
  
트랙백 0  |  댓글 0  |
 이전  1   다음 

전체 (842)
잡담 (529)
메모 (7)
감상 (109)
일기 (4)
참고 (187)
기록 (6)
fotowall :: ncloud tattertools RSS Feeds today : 113   yesterday : 112
total : 369515