2012-08-06 51 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