Era da un po 'che GCC mi ha catturato con questo, ma è successo oggi. Ma non ho mai capito perché GCC richieda typedef typename nei template, mentre VS e suppongo che ICC no. Il typedef typename è un "bug" o uno standard overstrict o qualcosa che è lasciato agli scrittori del compilatore?Perché devo usare typedef typename in g ++ ma non VS?
Per coloro che non so se mi spiego Ecco un esempio:
template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
std::map<KEY,VALUE>::const_iterator iter = container.find(key);
return iter!=container.end();
}
Il codice di cui sopra viene compilato in VS (e probabilmente in ICC), ma non riesce a GCC perché vuole in questo modo:
template<typename KEY, typename VALUE>
bool find(const std::map<KEY,VALUE>& container, const KEY& key)
{
typedef typename std::map<KEY,VALUE>::const_iterator iterator; //typedef typename
iterator iter = container.find(key);
return iter!=container.end();
}
Nota: Questa non è una funzione reale che sto usando, ma solo qualcosa di stupido che illustra il problema.
Il motivo per cui è necessario in g ++, è perché g ++ è più conforme allo standard. VS era un po 'trascurato in questa parte dell'analisi delle templatisation (che ha portato ad altri problemi in modelli più complessi). –
Sì, ma perché lo standard fa questo? Mi sono occupato di codice identico! –