2012-03-22 10 views
7

Vorrei utilizzare un typedef basato su modelli in vari punti, tra le altre cose nella dichiarazione di una funzione di modello stesso. Ecco il mio attuale tentativoC++ - Come utilizzare il metodo typedef soluzione alternativa in dichiarazione di funzione?

template<typename T> 
struct type{ typedef std::vector<T> sometype; } 

template<typename TT> 
void someFunction(type<TT>::sometype& myArg); 

(Si noti che il std::vector<T> è solo un esempio). Questo non funziona e fornisce un errore del compilatore "dichiarazione modello di 'void someFunction'". Ho già capito che ho bisogno di mettere un typename davanti type<TT>, vale a dire

template<typename TT> 
void someFunction(typename type<TT>::sometype& myArg); 

opere. Ma questa soluzione è - per non dire altro - un po 'ingombrante. Ci sono alternative?

+2

Questa soluzione è perfettamente soddisfacente e funzionante :-) –

+1

L'unica alternativa è il vero typedef del modello, che esiste in C++ 11. –

+0

@KerrekSB: Sta chiedendo una versione più elegante. Ha già detto che funziona come è. – jwueller

risposta

6

Non solo è ingombrante ma impedisce anche il parametro modello deduzione:

std::vector<int> a; 
someFunction(a); // error, cannot deduce 'TT' 
someFunction<int>(a); 

L'alternativa (in C++ 11) è alias di template:

template<typename T> 
using sometype = std::vector<T>; 

template<typename T> 
void someFunction(sometype<T> &myArg); 

std::vector<int> a; 
someFunction(a); 

Si potrebbe anche utilizzare una macro , tranne che le macro non sono mai la risposta giusta.

#define sometype(T) std::vector<T> 

template<typename T> 
void someFunction(sometype(T) &myArg); 

Inoltre, credo che la tua definizione di sometype non sia valida pre-C++ 11. Non dovrebbe avere quel typename:

template<typename T> 
struct type{ typedef std::vector<T> sometype; }; 

Penso C++ 11 cambia la regola per consentire, ma alcuni 03 compilatori C++ non è riuscito a diagnosticare correttamente il problema.

+0

AFAIK, 'typename' è ancora" vietato se non necessario "anche in C++ 11. Potresti aggiungere una nota su come la versione con alias modello non previene la deduzione di tipo? –

+0

Penso che tu abbia ragione riguardo al business 'typename'. Ho copiato incautamente quella parte da uno dei miei veri typedef che coinvolge un typedef basato su un altro typedef (basato su modelli) - e lì il 'typename' è ovviamente necessario. – janitor048

+0

@ R.MartinhoFernandes Sono abbastanza sicuro che sia cambiato in C++ 11, ma al momento non ho un buon riferimento per questo. – bames53

Problemi correlati