Loading...

템플릿 템플릿 파라미터

템플리의 파라미터로 템플릿을 사용하는 것을 말한다. 이를 사용하는 이유는 요소의 데이터형에 대해 다시 명시해 주지 않아도 컨테이너형을 명시할 수 있는 템플릿을 선언할 수 있다는 점이다. ex) Stack vStack; Stack > vStack; 첫번째 줄의 샘플을 보면 내부 컨테이너형을 명시하기 위해 컨테이너형과 함께 요소의 데이터형도 다시 넘겨준다. 하지만 템플릿 템플릿 파라미터를 사용하면 두번째줄의 예와 같이 요소의 데이터형에 대해 다시 명시해주지 않아도 된다. template // 템플릿 템플릿 파라미터, class 키워드사용해야함. class Stack { private: CONT elems; // elements public: void push(T const&); // push element ..

warning C4251

헐헐..이런삽질이.. warning 하나 없애보겠다고 그렇게 삽질을 하다니.... 분명 dll 지정해줬는데 말야 왜 인터페이스가 없다고그러는 겐지. 위의 첨부 파일을 읽어보면 답을 알 수 있다. 어느분이 쓴지는 몰겠지만 존경합네다.(--)(__) 꾸벅. 이 경구 메세지는 STL 컨테이너 정의에 _declspec(dllexport) 선언이 되어있지 않은 클래스템플릿을 export 할시에 나타난다. - 해결 방법 vector의 경우엔 템플릿을 인스턴트화 시킨 후 사용하면 해결되지만 다른것은 안된다. 이유는 vector는 워낙 많이 쓰는 거라 특별이 되도록 만들어 놨기 때문이라나~ vector 해결법 : template class __declspec(dllexport) std::vector; 그 이외엔 #pr..

데이터형이 아닌 클래스 템플릿 파라미터

인자로 넘겨받는 것이 반드시 데이터형일 필요는 없다. 아래와 같이 일반적인 값을 입력받아도 되고, 이전글처럼 디폴트값도 지정해 줄 수 있다. // 스택크기를 사용자로부터 입력받는다. template class Stack 클래스 템플릿 뿐 아니라 함수 템플릿에서도 사용이 가능하다 template T addValue(T const& elem) { return elem + VAL; } 이런 종류의 함수는 파라미터로서 많이 사용된다. std::transform(soruce.begin(), source.end(), dest.begin(), addValue); 함수템플릿 인스턴스는 오버로딩 함수들의 집합에 대한 이름일 뿐이며 현재표준에 따르면 오버로딩함수들의 집합은 템플릿 파라미터추론에 사용될 수 없다. 따라서 함..

기본 템플릿 인자

함수에서 기본인자값을 정해주는것과 비슷하게 템플릿의 데이터형도 디폴트로 미리 정의해 줄 수 있다. 이를 기본 템플릿 인자라고 한다. 그리고 언제나 ">"을 쓸때는 ">>" 을 주의해야 한다. 괄호가 두개 겹쳐있는것이 잘못하여 시프트연산자로 인식될 수도 있기 때문이다. #include #include template class Stack { private: CONT vecElem; public: void push(T const&); void pop(); T top() const; bool empty() const { return vecElem.empty(); } }; // 두개의 템플릿 파라미터를 가지므로 멤버함수정의시 모두 명시 template void Stack::push(T const& elem) {..

클래스 템플릿 특수화

클래스 템플릿을 특정 템플릿 인자로 특수화 할 수 있다. 이전글의 함수템플릿 오버로딩처럼 클래스 템플릿을 특수화 하려면 특정 데이터형에 맞게 구현해서 특정 데이터형에서 클래스 템플릿이 인스턴스화됐을때 잘못 동작할 수 있는 부분을 수정할 수 있다. 클래스 템플릿을 특수화 할려면 모든 멤버함수를 특수화해야한다. stack1.hpp template class Stack 위와 같이 만들었던 stack1을 특수화해서 stack2.hpp를 만들면 아래와 같다. stack2.hpp #include "stack1.hpp" template class Stack 즉, 클래스 템플릿을 특수화할 경우에는 template을 먼저쓰고 클래스를 언언하고, 그 뒤에 어떤 데이터혀으로 클래스 템플릿을 특수화 할 것인지를 기술한다. t..

클래스 템플릿

#include #include template // 데이터형 파라미터로 사용할 식별자 class Stack { public: void push(T const&); void pop(); T top() const; bool empty() const { return data_.empty(); } private: std::vector data_; }; 클래스 템플릿 내부에서 다른 일반적인 데이터형처럼 T를 사용하여 멤버와 멤버함수를 선언할 수 있다. 이 클래스의 데이터형은 Stack이고 T는 템플릿 파라미터이다. 그러므로 선언에서 이 클래스의 데이터형을 써야 한다면 Stack로 표기해야 한다. ex ) 복사생성자나 할당연산자. Stack (Stack const&); 복사생성자 Stack& operator= (..

오버로딩 (함수 템플릿)

템플릿함수도 같은이름의 함수를 여러개 쓰는 오버로딩이 가능하다. 아래의 예를 보면 같은 이름으로 오버로딩된 템플릿 함수들과 일반 함수를 볼 수 있다. inline int const& max(int const& a, int const& b) { return a < b ? b : a; } template inline T const& max(T const& a, T const& b) { return a < b ? b : a; } template inline T const& max(T const& a, T const& b, T const& c) { return ::max(::max(a,b), c); // int, int일 경우 가장 위의 nontemplete호출. } int _tmain(int argc, _TC..

인자추론

template inline T1 max(T1 const& a, T2 const& b) { return a < b? b:a; }; 위의 함수는 간단히 큰 함수를 반환하는 함수이다. 이를 사용할때 조심해야 할 부분이 있다. max(2,2,7); 을 사용하게 되면 분명 큰 수는 2.7이지만 반환값은 2가 된다. 그 이유는 반환값이 T1으로 되어있기 때문이다. 그렇다고 반환값을 T2로 할수도 없다. 이를 위한 해결로 아래와 같이 인자를 세개를 받도록 한다. template inline RT max(T1 const& a, T2 const& b) { return a < b? b:a; }; 첫번째 인자로 반환자료형을 받는데 첫번째 인자로 둔 이유는 간단하다. 인자추론을 사용하여 사용시 간편하게 하기 위해서이다. 만..