将std容器传递给模板化类

Jon*_*nks 2 c++ templates

为什么这不起作用?

template <typename T, typename U>  
class TSContainer {  
private:  
   U<T> container;  
};
Run Code Online (Sandbox Code Playgroud)

称为:

TSContainer<int, std::vector> ts;
Run Code Online (Sandbox Code Playgroud)

我认为解决方案可能是:

template <typename T, template <typename> typename C>  
class TSContainer  
{  
        C<T> container;  
};
Run Code Online (Sandbox Code Playgroud)

但这也不起作用.

Ada*_*man 5

这就是你需要的:

#include <vector>
template <typename T, template<typename, typename> class C>  
class TSContainer  
{  
    C<T, std::allocator<T> > container;  
};

int main() {
  TSContainer<int, std::vector> a;
}
Run Code Online (Sandbox Code Playgroud)

请注意,std::vector需要两个模板参数,第二个默认为std::allocator.或者,您可以写:

#include <vector>
template <typename T, template<typename, typename = std::allocator<T> > class C>  
class TSContainer  
{  
        C<T> container;  
};

int main() {
  TSContainer<int, std::vector> a;
}
Run Code Online (Sandbox Code Playgroud)

这两个都强制选择分配器.如果要控制向量使用哪个分配器(即用作第二个模板参数的那个C),您还可以使用:

#include <vector>
template <typename T, template<typename, typename> class C, typename A = std::allocator<T> >  
class TSContainer  
{  
        C<T, A> container;  
};

int main() {
  TSContainer<int, std::vector> a;
}
Run Code Online (Sandbox Code Playgroud)

这是最灵活的解决方案.