Mi sono appena imbattuto in una situazione molto strana scrivendo una classe C++11
std::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:
- Il codice non può essere compilato:
- Se aggiungo
(1)
, non compilare. - 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?
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
[Compila in GCC 4.8.] (Http://coliru.stacked-crooked.com/view?id=2250fa21d618a80511a96c95725346f5-50d9cfc8a1d350e7409e81e87c2653ba) –
Questo è il codice reale. Ho pensato di aver commesso l'errore che descrivi, ma in realtà non l'ho fatto. –