5

C++11 std::tupleのようなクラスを作成し、それを でコンパイルしようとしたときに、非常に奇妙な状況に遭遇しましたg++-4.7。基本的に必要なのは、ラップされた型のタプルです。私はこのようなものを書きました:

#include <tuple> 

template <class T> 
struct Wrapper { T x; }; 

template <class... Types> 
using Tuple = std::tuple<Wrapper<Types>...>; 

template <class... Types> 
struct X 
{ 
    using MyTuple = Tuple<Types...>; 
}; 

int main( int argc, char** argv ) 
{ 
    // Tuple<int,int> t;  // (1)
    using Y = X<int,int>;
    Y y;                  // (2)
    return 0; 
}

私は次の観察を行いました:

  1. コードはコンパイルされません:
  2. を追加する(1)と、コンパイルされます。
  3. と を削除する(1)(2)、同様にコンパイルされます。

1 のエラー メッセージ:

test.cpp: In instantiation of ‘struct X<int, int>’:
test.cpp:22:4:   required from here
test.cpp:10:44: error: wrong number of template arguments (2, should be 1)
test.cpp:4:8: error: provided for ‘template<class T> struct Wrapper’

質問:上記のコードは正しいと思いますが、実際にパラメーター パックを使用するのは初めてです。g++-4.7実験的な実装であるという事実を除いて、私のコードが気に入らない理由はありますか?

4

1 に答える 1

3

これは g++ 4.8 で修正された g++ 4.7 のバグである可能性が最も高いです。Ideone(g ++ 4.7.2を使用しており、コード例を複製せずにリンクすることはできません)は、言及したエラーを返しますが、Coliru(g ++ 4.8を使用)はエラーなしでコンパイルします。

于 2013-05-28T07:42:22.533 に答える