C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[24520] Re:Re:Re: 저의 착각이었네요. ^^;
김백일.cedar [cedar] 608 읽음    2003-02-27 09:38
김성철.마법사 님이 쓰신 글 :
: 친절한 답변 고맙습니다^^
:
: 타 컴파일러는 VC++ 입니다.
:
: 그리고 생성자를 고쳤기 때문에 컴파일 되는건 아니라고 생각됩니다.
:
: 에러를 내면서 less 의 함수 객체를 보여주는데요
:
: template <class _Tp>
: struct less : public binary_function<_Tp,_Tp,bool>
: {
:   bool operator()(const _Tp& __x, const _Tp& __y) const { return __x < __y; }
: };
:
: 여기서 less 의 함수객체의 () 연산자는 const 참조를 인자로 받습니다.
:
: 에러메세지가 다음과 같습니다.
:
: MailList 에 대한 연산자 '<' 가 같은 타입으로 구현되어 있지 않다
:
: 라고 나옵니다. 그래서
:
: bool operator<(const MailList &a, const MailList &b)
:
: 처럼 타입을 맞추어 주니 잘 되네요.

맞습니다. const 참조를 써야 됩니다.
제가 맞게 고쳐놓고도 착각을 했네요. ^^;
정확한 C++ 코딩 스타일을 지키면 이렇게 에러를 줄일 수 있다는 것을 보여주는 단적인 예지요.

: 저도 BCB 의 STL 이 VC++ 의 STL 보다 더 좋은건 아는데 에러가 나오니 좀 당황했었습니다.
: (저도 BCB 팬이랍니다^_^)
:
: 그런데 위의 경우를 보니 BCB 가 에러를 일으키는 것이 더 발전된 컴파일러라는 것을 보여주는 것 같습니다.
:
: 그리고 책의 예문을 그대로 올렸더니.. 백일님의 따끔한 지적을 많이 받네요^^ 고맙습니다.
:
: 귀차니즘에 빠져 지키지 않던 내용들의 중요성을 느끼는군요^^;;
:
: 참고로 책은 : STL Programming from the Ground up 입니다. 좀 오래된 책입니다.

MailList("James, Tom", "1102 W. Henry st", "Mission", "TX", "78572")
부분을 보고 책의 예문 같다는 생각은 했지만, 코딩 스타일이 좀 허접해서 아닌 것도 같다는 느낌이 들었네요. ANSI C++ 표준이 비교적 최근인 1998년에 제정되었다는 점을 고려하신다면, 가능한 최신의 책을 보시는 것이 좋습니다.

: 김백일.cedar 님이 쓰신 글 :
: : 생성자 부분을 고치니 C++빌더에서 컴파일이 되는군요.
: :
: : //---------------------------------------------------------------------------
: : #include <iostream>
: : #include <string>
: : #pragma hdrstop
: : #include <list> // 사용자 정의 헤더 파일과 STL 헤더파일만 #pragma hdrstop이하에 놓아도 됩니다.
: :
: : //---------------------------------------------------------------------------
: : using namespace std;
: :
: : class MailList
: : {
: : private:
: :     string name, street, city, state, zip; // 한 줄로 써도 됩니다.
: : public:
: :     MailList(string n, string s, string c, string st, string z):
: :         name(n), street(s), city(c), state(st), zip(z) {} // 생성자의 올바른 사용법입니다.
: :     string getName() const { return name; } // 가능한 한 const를 사용하는 습관을 가지세요.
: :     string getCity() const { return city; }
: :     string getStreet() const { return street; }
: :     string getState() const { return state; }
: :     string getZip() const { return zip; }
: : };
: :
: : bool operator<(const MailList &a, const MailList &b)
: : {
: :     return a.getName() < b.getName();
: : }
: :
: : bool operator==(const MailList &a, const MailList &b)
: : {
: :     return a.getName() == b.getName();
: : }
: :
: : void display(const list<MailList> &lst)
: : {
: :     for (list<MailList>::const_iterator p = lst.begin(); p != lst.end(); ++p) // p++보다 약간 빠릅니다.
: :         cout << p->getName() << ": "
: :              << p->getStreet() << ", "
: :              << p->getCity() << ", "
: :              << p->getState() << ", "
: :              << p->getZip() << endl; // 이것도 한줄로 가능하죠. 그리고 "\n"보다는 endl을 많이 씁니다: 스트림 flush 기능 때문이죠.
: : }
: :
: : int main()
: : {
: :     list<MailList> mlstA;
: :
: :     mlstA.push_back( MailList("James, Tom", "1102 W. Henry st", "Mission", "TX", "78572") );
: :     mlstA.push_back( MailList("김성철","둔전리","용인","시","449812") );
: :     mlstA.push_back( MailList("이동철","용인", "용인","시","449812") );
: :
: :     mlstA.sort();
: :     display(mlstA);
: :
: :     return 0;
: : }
: : 
: : : 참고로 타 컴파일러에서는 문제없이 컴파일됩니다.
: :
: : 어떤 컴파일러인지가 궁금하네요.
: :

+ -

관련 글 리스트
24510 "STL 관련 질문" 다음 소스가 컴파일 되지 않는 이유가 무엇입니까? 김성철.마법사 680 2003/02/26
24511     Re: 생성자를 옳게 고치니 되는군요. 김백일.cedar 690 2003/02/26
24514         Re:Re: 생성자를 옳게 고치니 되는군요. 김성철.마법사 646 2003/02/26
24520             Re:Re:Re: 저의 착각이었네요. ^^; 김백일.cedar 608 2003/02/27
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.