typedefs are a convenient way to give semantics to
variables and to stay flexible for future adjustments of the actual
used type.
For example if you deal with navigation software you might have
some typedefs for Direction and Speed
which could be simply ints. And you might have a
typedef for Position which is a
std::pair<int32_t, int32_t> so that all valid
GPS positions of some required resolution can be represented.
Say you want to have some toString or
operator<< methods for debuging purposes. So you
could have a call trace of your program like this.
and get an output like thisstd::ostream& operator<<(std::ostream& oss, Direction direction) { oss << "Direction=" << int(direction) << " degree"; return oss; } std::ostream& operator<<(std::ostream& oss, Speed speed) { oss << "Speed=" << int(speed) << " mps"; return oss; } void someFunction(Speed speed, Direction direction) { logger << "someFunction(" << speed << ", " << direction << ")"; //... }
someFunction(Speed=23 meter/second, Direction=42 degree)
Looks good, but doesn't work. If Speed and
Direction are typedefed to the same or
implicitly castable types the problem manifests:
error: ambiguous overload for 'operator<<'
Unfortunately, altough the keyword is named typedef
it is no type definition. The standard says in section 7.1.3:
A typedef-name is [...] a synonym for another type. A typedef-name does not introduce a new type the way a class declaration [...] or enum declaration does.
Prohibition of use of function overloading techniques is just one aspect of the problem. In general you have a type with different semantics but you can not treat it differently. This is a frequent source of annoyance.
PS:
Yes, int32_t is not part of ISO-C++. And this is a
mistake...