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 回答