#include <vector>
using std::vector;
template<template<typename> class x>
void test() {
x<int> a;
a.push_back(1);
}
int main() {
test<vector>();
return 0;
}
出于某种原因,尽管我有所期待,但我没有得到匹配的呼叫错误。为什么会这样?
答案 0 :(得分:4)
std::vector
不会带一个参数,而是两个(有Allocator
),因此无法与只应该只有一个的模板匹配。您需要更改为:
template <template <typename, typename> class x>
// or:
template <template <typename... > class x>
您还需要更改函数的返回类型,因为x<int>
不太可能是void
。
请注意,如果您使用带有两个typename
的版本,则需要在return语句中指定每个参数(例如x<int, std::allocator<int>>
),这就是您应该选择可变参数版本的原因({{ 1}})。
答案 1 :(得分:2)
std :: vector模板如下所示:
template<
class T,
class Allocator = std::allocator<T>
> class vector;
所以你有typename T和allocator,所以正确的代码应该是:
template<template<typename,typename> class x>
void test() {
x<int, std::allocator<int>>();
}