stl容器的模板模板参数与自定义模板类的行为不同

时间:2016-11-03 23:54:43

标签: c++ templates stl template-templates

我有以下结构和功能

template <class T> struct C {};

template <template <class S> class T, class U> void f() { T<U> tu; }

使用f()模板C我没有收到错误,当我用std::vector模仿它时,我没有错误。

int main() {
  f<C, int>();
}

不会产生错误

int main() {
    f<std::vector, int>();
}

产量

error: no matching function for call to 'f'
f<std::vector, int>();
^~~~~~~~~~~~~~~~~~~~~~~~
note: candidate template ignored: invalid explicitly-specified argument for template parameter 'T'
template <template <class S> class T, class U> void f() { T<U> tu; }

Cstd::vector之间的区别是什么?

2 个答案:

答案 0 :(得分:3)

这是因为vector有两个模板参数,而不是一个(TAllocator)。

您可以更改f模板以接受两个模板参数(或可变参数包):

template <template <class...> class T, class U> void f() { T<U> tu; }

或者您可以将vector别名为1参数模板:

template<typename T>
using vec = std::vector<T>;

答案 1 :(得分:2)

区别在于vector有两个模板参数,而不是一个。要解决此问题,您可以使用

template <template <class... S> class T, class U> void f() { T<U> tu; }