C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
분야별 포럼
C++빌더
델파이
파이어몽키
C/C++
프리파스칼
파이어버드
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

자유게시판
세상 살아가는 이야기들을 나누는 사랑방입니다.
[22044] Re:c++에서 다음 4가지의 차이점이 뭔지 알고 싶습니다.
빌더(TWx) [builder] 5249 읽음    2012-10-30 08:10
즈티브삽스 님이 쓰신 글 :
: 각 variable i는 컨테이너 안의 요소를 훑기 위한 목적에서 선언되는데, 그 선언 방식이나 유형에 차이가 있어서 그 차이점이 뭔지 알고 싶습니다.
:
: 늘 답변을 달아주시는 분들께 고마운 마음을 전합니다.
:
:
: 1번) string::size_type i
:
:
: 2번)
: template <typename ForwardIterator>
: ForwardIterator maximum_iterator(ForwardIterator first, ForwardIterator last)
: {
:    ForwardIterator i = first;
: }
:
:
: 3번)
: template <typename Sequence, typename UnaryFunction>
: Sequence mapf(Sequence c, UnaryFunction f)
: {
:    typename Sequence::iterator i;
: }
:
:
: 4번)
: for(vector<int::size_type i = 0; i < v.size(); i++)
: {
:   ....
: }
:
:
: 1번의 경우 string을 for-loop로 훑기 위해 size_type 앞에 string::을 붙였다는건 이해가 되고.
: 2번의 경우 iterator니까, i의 유형이 iterator 인 것도 이해가 됩니다.
: 그런데 3번의 경우, 똑같이 컨테이너를 훑을 iterator를 선언했는데 왜 앞에 2번과는 달리 "typename Sequence::"가 붙어야 하는지 이해가 어렵습니다.
: 그리고 4번의 경우, vector라는 컨테이너를 훑기 위함인데 왜 iterator가 아니라 일반 변수를 선언했는지 궁금합니다. vector에 iterator를쓰는건 별로 안좋은가요?






답변 )

댓글 기능이 불편해서... 답글로 적습니다...


우선...

어떤 Template Container에서 "size_type"의 의미가 컨테이너를 iterate 하기 위한 것으로 알고 계신가 본데요...

"size_type"의 의미는... 컨테이너가 갖고 있는 Element 요소의 갯수(size)를 의미하는 거지... Iterator 의 의미를 갖는 게 아닙니다..

Iterator의 목적으로 사용하려면... "size_type"을 사용할 게 아니고... "value_type"을 사용해야 합니다...


Template Container "map"을 이용해서...간단한 예를 들어 보죠...

...
std::map myMap;

myMap['a'] = 1;
myMap['b'] = 2;
...


위과 같이... "map"이 정의 되어있고... 컨테이너에서 2 개의 Element를 갖고 있다고 할 때...

각기의 Element 를 참조 하기 위해선... "iterator"를 이용할 수도 있고... 아래와 같이 "value_type" 을 이용할 수도 있습니다...

...
for each( std::map::value_type e in myMap)
{
          printf("first = %c, second = %d\n", e.first, e.second);     	
}
...



컴파일러가 Template Extension 을 지원 하고 있다면... 위와 같이 "for each" 구문으로...

"iterator" 대신 "value_type"을 이용할 수 있고... 아래와 같은 식으로 출력되는 것을 볼 수 있을 겁니다.


first = a, second = 1
first = b, second = 2




그리고....

"typename" 키워드를 사용해야 하는 것은 "C++ Language 표준"에 따르기 위해서 입니다...

간단한 예를 들어 보죠...


...
template < class T> class classA
{
	enum SomeEnumType { Red, Green, Blue};
};
...


위와 같이 어떤 Template 구조가 있다고 할 때...

아래와 같은 식으로 Template classB에서 SomeEnumType을 사용하면...

...
template < class T> class classB
{
	classA::SomeEnumType myEnum; // typename 키워드 없이 사용
};


template < class T> class classB
{
	typename classA::SomeEnumType myEnum; // typename 키워드 사용
};
...


컴파일러에 따라서는 "typename" 키워드가 없으면 에러를 내는 경우도 있고, 아닌 경우도 있을 텐데요...

나온지 오래된 구식의 컴파일러에서는 "typename" 키워드 없이 사용해도 에러 없이 컴파일이 될 것이고...

근래에 나온 컴파일러 에서는 "typename" 키워드 없이 사용할 때... 에러가 발생할 겁니다...

컴파일러가 Template를 파싱할 때... Instance 화가 되기 이전에는... 타입 T가 결정되어 있는 상태가 아니기 때문에...

첫번째 파싱 단계에서는 Syntax 체크 정도의 파싱을 하고... 타입  T가 결정될 때... T에 맞추어서 실제적인 코드를 생성하게 되는데..

이를... "Two Phase Template Argument Name Lookup"이라고 하고... "C++ Lanaguage Spec"의 표준이기도 합니다...



"C++ 표준"에서는 Template Argument 에 Dependent한 Name의 경우... "typename" 키워드를 명시적으로 지정하도록 하고 있고..

Template의 Argument, Implement 등이 복잡해지면 복잡해질 수록... 그에 따라서 모호성(Ambiguity)이 따르게 되기 때문에...

"C++ ISO"에서 이와 같은 표준을 정하게 된 거죠...

Visual Studio 2008인가 2010 부터도 "C++ 표준"에 따라서 Dependent Name 에 대해서 "typename"키워드를 사용하지 않으면

에러로 처리하도록 컴파일러가 수정되어 있을 겁니다...




...
빌더(TWx) [builder]   2012-10-30 08:50 X
<class T>로 입력해도... <CLASS T>로 'class'가 대문자로 표시되네요...
빌더(TWx) [builder]   2012-10-30 08:57 X
< class T>와 같이 '<' 다음에 공백 하나 넣어야 비로소 'class'가 소문자로 표시되나 보네요. 버그인가?

+ -

관련 글 리스트
22042 c++에서 다음 4가지의 차이점이 뭔지 알고 싶습니다. 즈티브삽스 4647 2012/10/28
22044     Re:c++에서 다음 4가지의 차이점이 뭔지 알고 싶습니다. 빌더(TWx) 5249 2012/10/30
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.