2012-10-30 7 views
1
template <class ContainerType, class elementType> 
void SerializeContainer ( ContainerType<elementType> container) 
{ 
} 

//call like this 
std::vector<int> vector; 
SerializeContainer(vector); 

아래의 내용은 컴파일되지 않습니다.이 문제를 해결할 수있는 방법이 있습니까?템플릿을 사용하여 컨테이너 템플릿을 만들 수있는 방법은 무엇입니까?

+0

_How_ 컴파일되지 않습니까? 질문을 편집하여 오류를 포함시킬 수 있습니까? –

답변

5

이 요소 유형을 추출하기 위해 컨테이너의 value_type 멤버를 사용하는 것이 더 쉽습니다 :

template <typename T> 
    void SerializeContainer (const T& container) 
    { 
     typedef typename T::value_type ElementType; 
     .......... 
    } 

이유 왜 ContainerType이를 때 ​​구문 ContainerType<ElementType> 만 작동하기 때문에 작동하지 않는 코드입니다 정말 템플릿.

template <template <typename> class ContainerType, typename ElementType> 
void serializeContainer(const ContainerType<ElementType>& container) { 
} 

을 그러나이 것이다 하지 일치하는 표준 C++ 컨테이너, 일부 숨겨진 기본 인자가 있기 때문에 : C는이를 위해 템플릿 템플릿 매개 변수를 지원 ++. 명시 적으로 작성하는 경우 :

std::vector<int, 
      std::allocate<int> > vector; 

그래서 당신은이 개 인수를 허용하도록 ContainerType 매개 변수를 확인해야합니다 :

template <typename <typename, typename> C, typename E, typename A> 
void serializeContainer(const C<E, A>& container) { 
} 

을하지만 템플릿 매개 변수의 다른 번호를 가지고 있기 때문에 다음이 set::set 일치하지 않습니다 :

std::set<int, 
     std::less<int>, 
     std::allocator<int> > set; 

단순히 당신이 일치하는 경우 ElementType에 명시 적으로 철자하려는 경우 (C++ 11 전) 한 크기에 맞춤 모든 솔루션이 없습니다. 컨테이너가 제공하는 특성을 고수하는 것이 좋습니다.

+0

정확히 원하는 걸! 감사! –

관련 문제