Originariamente inviato da MItaly
[...]
Il problema è che non è possibile avere dei typedef con parametri template (o meglio, puoi avere un typedef all'interno di una classe template, ma non puoi avere un typedef "a sé stante" parametrizzato con un parametro template); tuttavia, in C++11 (l'ultima revisione dello standard) è possibile fare qualcosa del genere con la keyword using.
http://en.wikipedia.org/wiki/C%2B%2B11#Alias_templates
Innanzitutto grazie per la risposta chiara ed esaustiva.
Andiamo al problema della typedef.
Premesso che il mio compilatore supporta lo standard C++11 e che già utilizzo alcune delle sue funzionalità (come le enum class o nullptr o i thread ...) , non riesco a "far funzionare" la keyword using.
Il seguente è stato il mio approccio:
-Utilizzando già thread, enum class e compagnia bella ho dato per scontato di avere accesso a tutte le funzionalità dell'ultimo standard.
Sono partito prendendo direttamente l'esempio pratico di wikipedia
codice:
template <typename First, typename Second, int Third>
class SomeType;
template <typename Second>
using TypedefName = SomeType<OtherType, Second, 5>;
questo non va bene per il mio caso , infatti scrivendo semplicemente
codice:
template<typename T> using list_iterator = std::list<T>::iterator;
//errore di sintassi 'using'
Sul momento ho pensato che l'errore fosse legato a tutto ciò che abbiamo appena detto, ed ho provato semplicemente ad aggiungere typename
codice:
template<typename T> using list_iterator = typename std::list<T>::iterator;
Niente da gli stessi errori anche così.
Così ho fatto qualche ricerca e su StackOverFlow ho trovato questo
codice:
template <class A>
struct Y
{
using Left = typename A::Left;
using Right = typename A::Right;
using AReverse = typename A::Sibling<Right, Left>; // Gives a compiler error
};
//dice che essendo Sibling un template bisogna scrivere in questo modo
using AReverse = A::template Sibling<Right, Left>;
Allora ho tentato di applicare questo concetto al mio caso , pensando potesse funzionare
codice:
template<typename T>
using list_iterator = typename std::list<T>::iterator;
// l'ho riscritto come:
template<typename T>
using list_iterator = std::list<T>::typename iterator;
sempre gli stessi errori.. così mi è sorto un dubbio, ed ho provato a scrivere:
codice:
template<typename T> using lista = std::list<T>;
//error C2988: dichiarazione/definizione di modello non riconoscibile
//error C2059: errore di sintassi: 'using'
Finalmente ho ben pensato di leggere quali fossero gli errori:
"dichiarazione di modello non riconoscibile"? Non è che non supporta lo standard?
Infatti non compila nemmeno il caso più semplice di tutti
codice:
using listaIntera = std::list<int>;
qui però da errori diversi
Errore 1 error C2143: errore di sintassi: ';' mancante prima di '='
Errore 2 error C2873: 'listaIntera': il simbolo non può essere utilizzato in una dichiarazione using
Errore 3 error C2513: 'int': nessuna variabile dichiarata prima di '='
ho come l'impressione che non supporti C++11, eppure questo mi sembra impossibile dato che (come già detto) uso tante altre "novità" introdotte nello standard.
Oppure (probabile) non ho capito niente sul suo utilizzo