我有以下结构和功能
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; }
C
和std::vector
之间的区别是什么?
答案 0 :(得分:3)
这是因为vector
有两个模板参数,而不是一个(T
和Allocator
)。
您可以更改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; }