加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c variadic模板,错误的参数包长度?

发布时间:2020-12-16 07:30:33 所属栏目:百科 来源:网络整理
导读:这是一个 gcc错误或以某种方式错误使用参数包? (用gcc 4.6.3编译:) #include iostreamtemplateclass...Ts struct tuple{};templateclass...class test;template template class... class tp,class...arg1Ts,class...arg2Ts class testtparg1Ts...,tparg2Ts.
这是一个 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
}

解决方法

我在这里写了一个可编辑的例子:

#include <iostream>

template <class...> class test;

template <
    template <class...> class tp,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版本有一个bug.是时候进入4.7了?

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读