template<typename T>
struct Q
{
typedef T t;
};
template<typename T>
void foo(Q<T> q)
{
using q_t = Q<T>;
//typedef Q<T> q_t; // if we uncomment this and comment 'using' the example compiles
typename q_t::t qwe; // <<<<<<<<<< Error: no type named ‘t’ in ‘using q_t = struct Q<T>’
}
int main(int argc, char *argv[])
{
Q<int> q;
foo(q);
return 0;
}
dGVtcGxhdGU8dHlwZW5hbWUgVD4Kc3RydWN0IFEKewogICAgdHlwZWRlZiBUIHQ7Cn07Cgp0ZW1wbGF0ZTx0eXBlbmFtZSBUPgp2b2lkIGZvbyhRPFQ+IHEpCnsKICAgIHVzaW5nIHFfdCA9IFE8VD47IAogICAgLy90eXBlZGVmIFE8VD4gcV90OyAvLyBpZiB3ZSB1bmNvbW1lbnQgdGhpcyBhbmQgY29tbWVudCAndXNpbmcnIHRoZSBleGFtcGxlIGNvbXBpbGVzCiAgICB0eXBlbmFtZSBxX3Q6OnQgcXdlOyAvLyA8PDw8PDw8PDw8IEVycm9yOiBubyB0eXBlIG5hbWVkIOKAmHTigJkgaW4g4oCYdXNpbmcgcV90ID0gc3RydWN0IFE8VD7igJkKfQoKaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKmFyZ3ZbXSkKewogICAgUTxpbnQ+IHE7CiAgICBmb28ocSk7CiAgICByZXR1cm4gMDsKfQ==