멤버 템플릿을 특수화 할 때 주의점
C++ 프로그래밍을 하면서 멤버 템플릿을 특수화 했더니, 컴파일 오류가 발생했다. 동일한 코드가 비주얼 스튜디오에서는 정상적으로
컴파일이 되었기에 당황스러웠다. 왜 그런지 검색을 해 보니, 멤버 템플릿의 특수화는 클래스 정의 내부에 있으면 안된다는 게 이유였다.
그래서 간단한 예제 코드를 작성해서 테스트를 해 보기로 했다.
먼저 멤버 함수 템플릿을 다음과 같이 작성하고 특수화 했다.
멤버 함수 템플릿의 특수화 예제 코드 보기
-
- struct Test1 {
-
- template <typename T1_, typename T2_>
- void MemberFunc(T1_, T2_) {
- cout << "template <typename T1_, typename T2_> void Test1::MemberFunc(T1_, T2_);" << endl;
- }
-
- #ifndef TEST1_FIX
- template <>
- void MemberFunc<double, int>(double, int) {
- cout << "template <> void Test1::MemberFunc<double, int>(double, int);" << endl;
- }
- #endif
- };
-
- #ifdef TEST1_FIX
- template <>
- void Test1::MemberFunc<double, int>(double, int) {
- cout << "template <> void Test1::MemberFunc<double, int>(double, int);" << endl;
- }
- #endif
멤버 함수 템플릿의 특수화 예제 코드 접기
그러자 컴파일러는 다음과 같은 오류를 뱉어내며 컴파일을 거부했다.

해결 방법은 간단하다. 멤버 함수 템플릿의 특수화 구문을 클래스 정의 밖으로 꺼내면 된다(위의 예제 코드에서는 첫 줄의 매크로 정의 주석을 풀어주면 된다).
클래스 내부에 선언된 클래스 템플릿을 특수화 할때에도 동일하다. 다만, 클래스 템플릿의 부분 특수화 구문은 클래스 정의 내부에 있어도 상관이 없다.
즉, 다음 예제 코드는 정상적으로 컴파일된다.
클래스 내부에 선언된, 클래스 템플릿의 특수화 예제 코드 보기
- #define TEST2_FIX
-
- struct Test2 {
-
- template <typename T1_, typename T2_>
- struct InnerType {
- InnerType() { cout << "template <typename T1_, typename T2_> struct Test2::InnerType;" << endl; }
- };
-
- template <typename T1_>
- struct InnerType<T1_, int> {
- InnerType() { cout << "template <typename T1_> struct Test2::InnerType<T1_, int>;" << endl; }
- };
-
- #ifndef TEST2_FIX
- template <>
- struct InnerType<int, double> {
- InnerType() { cout << "template <> struct Test2::InnerType<int, double>;" << endl; }
- };
- #endif
- };
-
- #ifdef TEST2_FIX
- template <>
- struct Test2::InnerType<int, double> {
- InnerType() { cout << "template <> struct Test2::InnerType<int, double>;" << endl; }
- };
- #endif
-
클래스 내부에 선언된, 클래스 템플릿의 특수화 예제 코드 접기
왜 이런 것일까? 다음 링크의 글을 읽어보면 알 수 있다.
http://kyeru.egloos.com/5778230