4

これは gcc のバグですか、それともパラメータ パックの使い方が間違っているのでしょうか?

(gcc 4.6.3 でコンパイル:)

#include <iostream>
template<class...Ts> struct tuple{};
template<class...>class test;

template< template <class...> class tp,
  class...arg1Ts,
  class...arg2Ts> 
class test<tp<arg1Ts...>,tp<arg2Ts...>>{
  public:
  void test1(arg1Ts... arg1s,arg2Ts... arg2s){
  std::cout<<sizeof...(arg1s);  //Why is this 2? Why not 0?
  std::cout<<sizeof...(arg2s);  //2 ok
 }
};
int main(){
 test<tuple<>,tuple<char,int>> t1; //(arg1Ts... = empty), (arg2Ts... = char,int)
 t1.test1('a',2); //prints 22, not 02
}
4

1 に答える 1

2

ここにコンパイル可能な例を示します。

#include <iostream>

template <class...> class test;

template <
    template <class...> class tp,
    class...arg1Ts,
    class...arg2Ts
> 
class test < tp<arg1Ts...>, tp<arg2Ts...> > {
public:
    void test1(arg1Ts..., arg2Ts...) {
        std::cout << sizeof...(arg1Ts) << ' ' << sizeof...(arg2Ts) << '\n';
    }
};

template <typename...> class Pack;

int main(){
   test< Pack<>, Pack<char,int>> t1;
   t1.test1('a', 2);
}

(あなたのものと大差ありませんが、きれいにコンパイルされます)

clang 3.0 を使用すると、次のようになります。

0 2

これはまさに期待されていることです。したがって、使用しているgccのバージョンにバグがあると思います。4.7 に移行する時間ですか?

于 2012-05-10T12:51:57.083 に答える