2012-05-10 3 views
4

Это ошибка gcc или как-то неправильное использование пакетов параметров?C++ variadic template, неправильная длина пакета параметров?

(Составлено с 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 
} 
+1

Вы пробовали использовать текущую версию gcc? Кстати. было бы полезно, если бы вы предоставили компилируемые примеры здесь. – PlasmaHH

+1

'griwes @ Griwes-Linux: ~/tests $ g ++ - 4.7 2.cpp -o t2 -std = C++ 11; griwes @ Griwes-Linux: ~/tests $ ./t2; 02' - работает в g ​​++ 4.7. Я тестировал также с помощью g ++ 4.6 и печатал '22', как вы писали. Кажется, это ошибка, исправленная в новой версии. – Griwes

+0

@PlasmaHH Я исправил код так, чтобы он компилировался, thx. – dunedain

ответ

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?

+0

Кажется, что это так, спасибо за тестирование с помощью clang. – dunedain

Смежные вопросы