Yes, what you're experiencing is "normal", or at least ... expected.
I may not have fully understood your intent, but my guess is that you're looking for something like this;
Code:
template<typename T> class MyTraitsClass
{
typedef const T & const_type;
};
template<> class MyTraitsClass<short>
{
typedef short const_type;
};
// other specialisations for the other basic types.
template<typename T> class TypeStripper
{
typedef typename T actual_type;
};
// and a series of partial specialisations for reference types
template<typename T &> class TypeStripper
{
typedef typename T actual_type;
};
template<typename const T &> class TypeStripper
{
typedef typename T actual_type;
};
template<typename T> class ArgumentHelper
{
typedef typename MyTraitsClass<TypeStripper<T>::actual_type>::const_type const_type;
// may need typename keyword more than once in here: check that
};