The correct way is to use template template parameter:
C++11:
template <template<typename...> class C, typename T0, typename T1> C<T1> convert_container(const C<T0>& container, T1 value) { C<T1> new_container; // Do some stuff... return new_container; }
C++03 (with allocator rebind):
template <template<typename, typename> class C, typename T0, typename T1, typename Alloc> C<T1, typename Alloc::template rebind<T1>::other> convert_container(const C<T0, Alloc>& container, T1 value) { C<T1, typename Alloc::template rebind<T1>::other> new_container; // Do some stuff... return new_container; }
C++03 (without rebind):
template <template<typename, typename> class C, typename T0, typename T1, typename Alloc> C<T1, std::allocator<T1> > convert_container(const C<T0, Alloc>& container, T1 value) { C<T1, std::allocator<T1> > new_container; // Do some stuff... return new_container; }