2016-10-05 142 views
3
#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; 
} 

由於某種原因,儘管我有我的期望,但沒有找到匹配的呼叫錯誤。爲什麼會發生?模板模板參數:找不到匹配的呼叫

+1

哪裏型'x'界定?你爲什麼從'void'函數返回? –

+1

看看std :: vector聲明。 –

+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>>),這就是爲什麼你應該更喜歡一個可變版本(typename...)每個參數。

+0

所以我應該列出每個模板參數? – RomaValcer

+1

@RomaValcer是或使用可變版本。 – Holt

2

的std :: vector模板看起來如下:

template< 
    class T, 
    class Allocator = std::allocator<T> 
> class vector; 

讓你有類型名T和分配的,所以正確的代碼應該是:

template<template<typename,typename> class x> 
void test() { 
    x<int, std::allocator<int>>(); 
}