Известно, что
typedef не создает новый тип, а просто вводит алиас для существующего типа. Т.е., например, объявив
typedef int myint_t;
нельзя перегрузить функцию для
myint_t, так как типы неразличимы для компилятора:
void f( int );
void f( myint_t ); // error
Если мы хотим эти типы различать, то решение состоит в том, чтобы создать структуру
myint_t вместо
typedef и перегрузить все необходимые операции, а также оператор приведения типа. В библиотеке
Boost уже есть обертка для такой задачи —
strong_typedef, что избавляет от необходимости писать её самим.