template< class T > struct remove_pointer {typedef T type;};
template< class T > struct remove_pointer<T*> {typedef T type;};
template<class ptr_to_t>
void f(ptr_to_t x) {
typedef ptr_to_t t; // does not compile
typename remove_pointer<t>::type elem = *x;
}
int main()
{
int five = 5;
f<int*>(&five);
return 0;
}
dGVtcGxhdGU8IGNsYXNzIFQgPiBzdHJ1Y3QgcmVtb3ZlX3BvaW50ZXIgICAgICAgICAgICAgICAgICAgIHt0eXBlZGVmIFQgdHlwZTt9Owp0ZW1wbGF0ZTwgY2xhc3MgVCA+IHN0cnVjdCByZW1vdmVfcG9pbnRlcjxUKj4gICAgICAgICAgICAgICAge3R5cGVkZWYgVCB0eXBlO307Cgp0ZW1wbGF0ZTxjbGFzcyBwdHJfdG9fdD4Kdm9pZCBmKHB0cl90b190IHgpIHsKICAgIHR5cGVkZWYgcHRyX3RvX3QgdDsgLy8gZG9lcyBub3QgY29tcGlsZQogICAgdHlwZW5hbWUgcmVtb3ZlX3BvaW50ZXI8dD46OnR5cGUgZWxlbSA9ICp4Owp9CgppbnQgbWFpbigpCnsKICAgIGludCBmaXZlID0gNTsKICAgIGY8aW50Kj4oJmZpdmUpOwogICAgcmV0dXJuIDA7Cn0=