Il seguente codice viene compilato correttamente in g ++ e clang:E '"typename" permesso/richiesto in C++ 11 using-declaration?
template<typename T>
struct foo
{
class iterator;
using bar = foo::iterator;
};
int main() {}
tuttavia MSVC 2013 dà i seguenti errori:
foo.cpp(9): error C2061: syntax error : identifier 'iterator'
foo.cpp(10) : see reference to class template instantiation 'foo<T>' being compiled
foo.cpp(9): error C2238: unexpected token(s) preceding ';'
Se cambio quella linea a:
using bar = typename foo::iterator;
poi tutto tre compilatori lo compilano con successo. La versione originale è corretta? (Cioè è un baco MSVC, o un'estensione gcc/clang)
Consentito, sì. Richiesto, no. 'foo :: iterator' assegna un nome all'attuale istanza. –