2012-05-10 14 views
4

これはgccのバグか、パラメータパックの使い方が間違っていますか?C++バリデーションテンプレート、間違ったパラメータパックの長さ?

は(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の現在のバージョンで試してみましたか? btw。ここでコンパイル可能な例を提供した場合は役に立ちます。 – 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コンパイルするようにコードを修正しました。 – 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