STL스터디.. gcc로는 불가능?wogud86 2007.07.06 22:57 |
답변 1 조회 516 |
---|
프로젝트와 함께하는 STL의 아름다움이란 책을 공부하고 있는데요...
물론 닷넷 컴파일러를 사용하는게 좋다는 충고가 있었습니다만.. ㅡㅡ;
Dev C++을 사용해서 gcc로 컴파일을 해봤는데...
처음부터 에러가 나더군요...
전체 코드입니다..
#include <iostream>
#include <vector>
#include <list>
#include <set>
#include <string>
#include <iterator>
using namespace std;
template<typename Container>
void PrintContainer( string strTitle, Container& con);
int main()
{
int pArray[5] = { 9, 1, 4, 7, 2};
list<int> l;
copy( pArray, pArray+5, front_inserter(l) );
PrintContainer( "전위", l);
vector<int> v;
for( int i = 0; i < 5; i++)
back_inserter( v ) = pArray[i];
PrintContainer( "후위", v);
set<int> s;
copy(pArray, pArray+5, inserter(s, s.begin()));
PrintContainer( "삽입", s);
return 0;
}
template<typename Container>
void PrintContainer( string strTitle, Container& cont)
{
cout << strTitle << " : ";
for( Container::iterator it = cont.begin(); it != cont.end(); ++it)
{
cout.width(3);
cout << *it;
}
cout << endl;
}
여기서
Container::iterator it
이부분에서 계속 에러가.. ㅡ,.ㅡ;;
expected ';' before "it" 이라는 군요...
gcc로는 이런 문법자체가 컴파일 되지는 않는지....
- 추가된 질문
- 2007.07.06 22:59 추가
- 물론 VS.Net 2005 에서는 잘돌아 갑니다.. ㅡ,.ㅡ;;
의견 쓰기
질문자 채택된 경우, 추가 답변 등록이 불가합니다.
re: STL스터디.. gcc로는 불가능?theuhm 2007.07.07 01:50 |
|
---|
와~ 자세한 설명 감사합니다 ^^
위와 같은 구문은 의존적인 타입라고 부릅니다. Container::iterator는 템플릿 파라미터 Container에 의존적인 타입이기 때문에, C++규정에 의하여 선언 전에 typename 이라고 붙여 줘야 합니다.
PrintContainer 함수를 어떤 타입에 대해 구체화할 때, 실제로 Container가 어떤 타입인지 주어져야만 Container::iterator 라는 식별자가 타입인지, 클래스의 정적멤버인지, 클래스 내부의 enum상수 값인지 알 수가 있습니다. 템플릿을 컴파일할 때는 구체화할 타입이 정해지지 않은 상태에서 문법성 검사만을 행하기 때문에 실제 이 부분에서는 Container::iterator라는 식별자가 무엇인지 컴파일러는 확정할 수가 없습니다.
표준에 의하면, 템플릿 파라미터에 의존적인 식별자는 명시적으로 typename 키워드가 주어지거나, 로컬 영역에서 합당한 타입 선언이 이루어지지 않은 이상 타입이름으로 간주되어서는 안된다고 적시되어 있습니다.
따라서 이점에서는, gcc가 표준을 제대로 따르고 있고, vc.net 의 컴파일러는 표준을 비켜가고 있다고 봐야죠.
gcc에서 컴파일하기 위해서는
typename Container::iterator it
라고만 선언하면 됩니다.
PS : C++표준 라이브러리를 사용함에 있어, MS의 컴파일러는 그다지 좋은 환경이 못됩니다. 표준과 어긋나는 습관이 든다고나 할까요... 책의 저자도 무엇인가 뿌리깊은 습관이 잘못 박혀 있는 것 같군요.
'Application-level프로그래밍' 카테고리의 다른 글
(C) 전처리구문 (0) | 2009.07.27 |
---|---|
(C)정적 2차원 배열 전달 (0) | 2009.07.22 |
(C) 함수포인터 캐스팅 (0) | 2009.05.31 |
(C) 열거형 (0) | 2009.05.31 |
(C)비트필드 구조체 (0) | 2009.05.31 |