2017-02-04 107 views
2

我想這樣可以推斷TT類模板的T類創建模板:模板函數模板的參數 - 扣除失敗

#include <iostream> 
#include <algorithm> 
#include <vector> 

using namespace std; 

template < template <typename> class TT, typename T> 
T f(TT<T*> & A){ 
    cout << "it works\n"; 
    return *A[0]; 
}; 


int main(){ 
    vector<int*> v; 
    f(v); 
    return 0; 
} 

我有一個錯誤(與鏗鏘-4.0):

temded2.cpp: In function ‘int main()’: 
temded2.cpp:20:21: error: no matching function for call to ‘f(std::vector<int*>&)’ 
    f<std::vector>(v); 
        ^
temded2.cpp:12:3: note: candidate: template<template<class> class TT, class T> T f(TT<T*>&) 
T f(TT<T*> & A){ 
^

我認爲TT應該等於std :: vector和T應該等於int,我做錯了什麼?

回答

4

您的模板模板參數不是您認爲的那樣。 std::vector<T>比您想象的更多,包括您未考慮的默認模板參數。幸運的是,在C++ 11可變參數會幫你解決這個問題

#include <iostream> 
#include <vector> 

template < template <typename, typename...> class TT, typename T, typename... Args> 
T f(TT<T*, Args...> & A) 
{ 
    std::cout << __PRETTY_FUNCTION__ << '\n'; 
    if (A.size() > 0) 
     return *(A[0]); 
    return T(); 
}; 

int main() 
{ 
    std::vector<int*> v; 
    f(v); 
    return 0; 
} 

輸出

T f(TT<T *, Args...> &) [TT = vector, T = int, Args = <std::__1::allocator<int *>>] 

注意Args以上。因爲在您的特定模板模板參數期望的參數列表中缺少這些參數,所以不存在匹配項。正如你所看到的,可變參數可以解決這個問題。

+0

謝謝,作品,當我有:template