본문 바로가기

프로그램언어/C++

Template 사용

14.5.2/1
A template can be declared within a class or class templates; such a
template is called a member template. A member template can be
defined within or outside
its class definition or class template definition. [...]

14.5.4.3/2
If a member template of a class template is partially specialized,
the member template partial specializations are member templates of
the enclosing class template; [...]

14.7.3/18
In an explicit specialization declaration for a member of a class
template or member template that appears in namespace scope,
the member template and some of its enclosing class template may
remain unspecialized, except that the declaration shall not explicitly
specialize a class member template if its enclosing class templates are
not explicitly specialized as well.
[...] [Example:


template<class T1> class A {
    template<class T2> class B {
        template<class T3> void mf1(T3);
        void mf2();
    };
};
    
template<> template<class X>
class A<int>::B { };
    
template<> template<> template<class T>
void A<int>::B<double>::mf1(T t) { }
    
template<class Y> template<>
void A<Y>::B<double>::mf2() { }  // ill-formed; B<double> is specialized but
                                 // its enclosing class template A is not.

처음 코드의 경우 전문화된 struct a<0>은 멤버 템플릿이 아니므로 14.5.2/1에 의하여
struct C 내부에서 정의할 수 없고 14.7.3/18에 의하여 전문화되지 않은 struct C의
전문화된 struct a<0>을 정의한 것이므로 에러입니다.
두번째 코드의 경우 부분 전문화된 struct c<a, 0>은 역시 멤버 템플릿이고 이때
struct C 내부에서 정의할 수 있으므로 적법합니다. 물론 struct C의 외부에서
부분 전문화를 정의할 수도 있습니다.
template <typename T> 
struct C { 
   template <int a, int b> struct c {}; 
}; 

template <typename T>
  template <int a>
  struct C<T>::c<a, 0> {};

'프로그램언어 > C++' 카테고리의 다른 글

Smart Pointer  (0) 2008.08.10
STL Find 삽질 기행문  (0) 2008.08.06
make 강좌  (0) 2008.07.22
AutoTools  (0) 2008.07.22
[C++] 캐스트 연산자  (0) 2008.07.22