模板模板参数:未找到匹配的调用

时间:2016-10-05 13:01:28

标签: c++ templates

#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;
}

出于某种原因,尽管我有所期待,但我没有得到匹配的呼叫错误。为什么会这样?

2 个答案:

答案 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>>();
}