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。(这是一个简化的示例。)

4

2 回答 2

6

不要扩展参数包:

fog<0>(vs,ts);

否则编译器不知道哪个模板参数属于哪个元组。这样,元组的模板参数就会照常扣除。

于 2012-08-06T15:51:13.270 回答
5

写:

fog<0>(vs,ts);  

代替

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

并让编译器推断类型。

至于为什么第二种形式不起作用,因为可变参数只能是最后一个参数。该形式不能有两个可变参数模板参数。

于 2012-08-06T15:51:32.603 回答