2012-08-06 85 views
3

考慮:呼叫沒有匹配函數的可變參數參數包功能

#include<tuple> 

template<int N,typename... Vs,typename... Ts> 
void fog(const std::tuple<Vs...>& vs , const std::tuple<Ts...> & ts) 
{ 
} 

template<typename...Vs,typename...Ts > 
int gof(const std::tuple<Vs...>& vs , const std::tuple<Ts...> & ts) 
{ 
    fog<0,Vs...,Ts...>(vs,ts); 
} 

int main() 
{ 
    std::tuple<int,double> t; 
    gof(t,t); 
} 

爲什麼編譯器(G ++ - 4.6)找不到fog功能和如何使它找到它?

error: no matching function for call to ‘fog(const std::tuple<int, double>&, const std::tuple<int, double>&)’ 
note: candidate is: 
note: template<int N, class ... Vs, class ... Ts> void fog(const std::tuple<Vs ...>&, const std::tuple<_Tail ...>&) 

是的,我需要積分模板參數N。 (這是一個歸結例子。)

+0

謝謝你的(正確的)答案。 @mfontanini幾秒更快。我沒有其他標準 – ritter 2012-08-06 16:09:53

回答

6

不展開參數包:

fog<0>(vs,ts); 

否則編譯器不知道哪個模板參數屬於哪一個數組。這樣,元組的模板參數就像往常一樣被扣除。

5

寫:的

fog<0>(vs,ts); 

代替

fog<0,Vs...,Ts...>(vs,ts); 

,讓編譯器推斷類型。

至於爲什麼第二種形式不起作用,因爲可變參數可能只是最後一個參數。這種形式不能有兩個可變參數模板參數。

+0

候選人看起來有點奇怪(注意'_Tail'):'const std :: tuple &,const std :: tuple <_Tail ...>&'。這是它的一個症狀嗎? – ritter 2012-08-06 15:56:50