일단 아래 코드를 컴파일 해보자. 100% 안될 것이라고? 어디에서..? int C; class C; int X; template class X; struct S; template class S; int main( void ) { return 0; } g++43 [ikpil@localhost work]$ g++ -o template_linktest template_linktest.cpp template_linktest.cpp:8: error: ‘template struct X’ redeclared as different kind of symbol template_linktest.cpp:5: error: previous declaration of ‘int X’ template_linktest.cpp:13:..
책 정리/C++ Template 검색 결과
C++ 기초 책을 보다 보면, 템플릿에 대해서 10장 분량으로 설명만 하고 넘어간다. 그도 그럴것이 방대한 템플릿에 대해서 자세히 설명 할려면 출판사와 저자가 책을 두권 낼지 세권 낼지 스타 한판을 해야 되기 때문이다. 그래서 다른 책들에는 클래스 템플릿의 가상 멤버 함수에 대해 언급하고 있지 않는다.( .. effective, excetional 에 없네; ㅋㅋ 비야네 책에서도 못 찾겠다.) 당연한 것이라서 그럴 수도 있다. 그 당연한 것이 무엇일까? 바로 클래스 템플릿의 가상 멤버 함수는 파라미터화 할 수 없다. 즉, 가상 멤버 함수 템플릿은 존재 하지 못한다는 것이다. 왜 일까? 현재의 C++ 에서 가상 멤버 함수의 경우, 가상 테이블의 1개의 레코드를 사용 한다. 그래서 컴파일 될 때 몇개의 가상..
이번 장에선 그동안 이야기 하지 않았던 템플릿의 제약 사항이나, 예외 상황에 대해서 정리해 보자. 8.1 파라미터화된 선언의 다양한 형태 이런건 그냥 코드 보면 된다. 선언이 무엇이고 정의가 무엇인지 알기 때문에 선언이 어떻게 파라미터화만 봐도 충분하다고 생각 한다. 그래도 코드는 정의 선언 둘 다 나열해 보자. // 클래스의 파라미터화된 선언 예 template class List { public: // 클래스 템플릿에서 멤버 함수의 파라미터화된 선언 예 template List( List const &); }; // 클래스 밖에서 클래스의 멤버 함수를 파라미터화한 정의 예 template template List::List(const List &) { // ... } // 전역에서 함수의 파라미터화된..
지금까지 정리했던 내용 중에서 나왔던 용어들을 다시 한번 정리 하는 장이라고 보면 된다. 클래스 템플릿? 템플릿 클래스? 뭐가 맞는거야? 맞는다라는 개념은 아닐 것이다. 저자의 뜻을 정리하자면, "괜시리 헷갈리기만 하니까 나는 클래스 템플릿만 쓰겠다. 갖은 맥락으로 함수 템플릿 이라고 지칭 하겠다" 이다. .. 멋진 녀석. ㅋㅋ 인스턴스화? 특수화? 템플릿의 인자를 실제 값으로 인식해 클래스나 함수를 생성하는 과정을 "템플릿 인스턴스화"라고 한다. 이 템플릿 인스턴스화롸 나온 결과를 "특수화" 라고 한다. .. 어?? 이게 무슨 말이래. 특수화는 내가 특별히 템플릿 코드를 정의해 주는걸 말하는게 아닌가? 라고 생각하는 찰나에 "이미 코드가 만들어 졌으니 템플릿 입장에선 특수화가 맞군" 이다. 그래서 프로..
템플릿 코드는 디버깅 하기가 일반적인 코드보다 좀 더 까다롭다. 이 까다로움은 깊은 산속 옹달샘 만큼이나 찾기 어려운 문법 에러와 개념없이 작동되는 기능 때문에 생긴다. 깊은 산속 옹달샘 만큼이나 찾기 어려운 문법 에러 템플릿을 쓰다 보면, 템플릿 코드가 인스턴스가 되었을 때, 한편의 서정적이며 순수한 에러 메세지를 본 적이 있을 것이다. 기억을 더듬어 보니, 그런 에러가 다시 보고 싶다. 다음 코드를 컴파일 해 보자. #include #include bool order( std::list a, std::list b ) { return a.size() > b.size(); } int main( void ) { std::list d; d.push_back( 1 ); std::sort( d.begin(), ..
아니 왜 템플릿에서 미리 컴파일된 헤더 기법을 다루지? 라고 스스로 자문을 구해 보았었다. 처음에는 별 생각이 없었지만, 지속된 질문을 통해 한가지 사실을 알게 되었다. 템플릿 코드들은 대부분 "포함모델"로 코드를 관리 된다. 그러므로 모두다 헤더 파일 이란 뜻!!!!! 그렇다! 미리 헤더 파일을 컴파일 함으로써, 가뜩이나 템플릿 때문에 컴파일 타임 잡아 먹는다고 팀원들에게 눈치 보는데, 이참에 얍실스럽게 , "나 때문에 컴파일 타임 줄어들었잖아~" 라고 웃어 줄 수 있다는 것이다!!! 미리 컴파일된 헤더 기법이란 무엇인가? 헤더 파일을 미리 컴파일 해 두어, 컴파일 시간을 줄이는 기법이다. 이 기법은 표준이 아니므로, 컴파일러 제작자들마다 구현 방법 및 적용 방법이 다르다. 자세한 내용은 자신이 이용하..
최근댓글