2013-05-28 10 views
5

Mi sono appena imbattuto in una situazione molto strana scrivendo una classe C++11std::tuple e cercando di compilarla con g++-4.7. Quello di cui ho fondamentalmente bisogno è una tupla di tipi avvolti. Ho scritto qualcosa di simile:Confusione pacchetto parametri

#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; 
} 

ho fatto le seguenti osservazioni:

  1. Il codice non può essere compilato:
  2. Se aggiungo (1), non compilare.
  3. Se rimuovo (1) e (2), viene compilato anche.

Messaggio di errore per 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’ 

Domanda: A mio parere il codice di cui sopra è corretto, ma è la prima volta che ho effettivamente utilizzare i pacchetti di parametri. Ci sono motivi per cui il codice g++-4.7 non mi piace, ad eccezione del fatto che si tratta di un'implementazione sperimentale?

+2

Il codice che hai fornito compila bene, e dall'errore sembra che tu abbia accidentalmente scritto 'std :: tuple >' invece di 'std :: tuple ...>'. Si prega di fornire il codice reale e riprovare prima di postare. – Xeo

+1

[Compila in GCC 4.8.] (Http://coliru.stacked-crooked.com/view?id=2250fa21d618a80511a96c95725346f5-50d9cfc8a1d350e7409e81e87c2653ba) –

+0

Questo è il codice reale. Ho pensato di aver commesso l'errore che descrivi, ma in realtà non l'ho fatto. –

risposta

3

Questo è molto probabilmente uno bug in g++ 4.7 corretto in g ++ 4.8. Ideone (che usa g ++ 4.7.2, e al quale non posso collegarmi senza duplicare il tuo esempio di codice, argh) fornisce l'errore che hai menzionato, mentre Coliru (usando g ++ 4.8) compila senza errori.

+0

Non è accatastato. È Coliru. Sebbene sia Stack-Croocked's. –

+0

si chiama Stacked-Crooked su http://isocpp.org/get-started, non importa che sia importante – TemplateRex

+0

Posso confermare che GCC 4.7.2 fornisce l'errore, mentre GCC 4.8 e 4.9 non lo snapshot. Ma il bug specifico che hai linkato dice "risolto per 4.7.1" ..? – jogojapan