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);

そして、コンパイラに型を推測させます。

可変個引数パラメータは最後のパラメータにしかなり得ないため、2番目の形式が機能しない理由については。その形式の2つの可変個引数テンプレートパラメータは存在できません。

于 2012-08-06T15:51:32.603 に答える