In fact, the first version of the overloaded member function foo has a parameter of type unsigned int , and not an unsigned long long int , as you probably wanted to ask. In this case, LL is the name of the parameter, not the typedef-name .
dcl.spec # 3 :
It is interpreted if it’s not necessary to know how it’s been in the decl-specifier-seq. -specifier-seq.
Thus, the compiler encounters 2 candidates during the overload resolution : void foo(unsigned int) and void foo(long long int) , both of which require integral conversion , therefore they have the same rank, and the compiler produces the message described by you.