템플릿에서 typename키워드와 class키워드의 차이

  1. template < typename T >
  2. template < class T >

템플릿을 정의할 때 둘 다 많이 봤는데 이 둘의 차이는 뭔가요?

그리고, 또 다른 질문은 위키피디아에서 이런 템플릿을 봤는데 여기서 각 키워드는 무슨 의미로 쓰는 건가요?

template < template < typename, typename > class Container, typename Type >
class Example
{
     Container< Type, std::allocator < Type > > baz;
};

1답변

  • 좋아요

    0

    싫어요
    채택취소하기

    보통은 typenameclass 중 어느 걸 써도 상관없습니다.

    template<class T>
    class Foo{};
    
    ///두 개가 같음
    
    template<typename T>
    class Foo{};
    

    둘을 혼용할 수 없는 특수한 경우는

    1. dependent type의 경우 - typename

    다른 template 파라미터와 관련된 타입을 쓰는 경우, typename 키워드만 쓸 수 있습니다.

    template<typename param_t>
    class Foo
    {
        typedef typename param_t::baz sub_t;
    };
    

    2. template template을 설정하는 경우 - class

    두 번째 질문이 여기에 해당합니다.

    template template은 꼭 다음과 같이 class키워드를 써야 하고, 이 때는 typename과 혼용할 수 없습니다 template < template < typename, typename > class Container, typename Type >

    또한, template을 인스턴스화할때는 다음과 같이 class만 쓸 수 있습니다. template class Foo<int>;

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.