Gianni Mariani wrote:
Alex wrote: Hello people,
I am getting errors from VS2003 when working with typedef'ed types.
For example, assume that I have a type T, defined in a 3rd party include
file based on some condition
#if (condition)
typedef char T;
#else
typedef short T;
#endif
Let's assume, for the sake of discussion that the condition is true. So
we get:
typedef char T;
Now, I want to use the unsigned form of T in my code:
unsigned T t;
This gives me the following errors:
error C2628: 'T' followed by 'unsigned' is illegal (did you forget a
';'?)
When instead I try:
T unsigned t;
I get:
error C2146: syntax error : missing ';' before identifier 't'
error C2377: 'T' : redefinition; typedef cannot be overloaded with
any other symbol. see declaration of 'T' error C2065: 't' :
undeclared identifier
What am I doing wrong?
I would do this differently. First I would use a template class like:
template <typename T>
struct Type
{
typedef T t_signed;
typedef unsigned T t_unsigned;
This will not fly: unlike const or volatile, unsigned is not a qualifier. It
cannot be stripped of or added by a template in a straight forward way. If
you want a template to yield the (un)signed version of a type, you need to
do a bunch of partial specializations like, for instance:
namespace DO_NOT_USE {
template < typename T >
struct signed_type {
typedef T the_type;
}; // signed_type
template <>
struct signed_type< unsigned char > {
typedef signed char the_type;
};
template <>
struct signed_type< char > {
typedef signed char the_type;
};
template <>
struct signed_type< unsigned short > {
typedef short the_type;
};
template <>
struct signed_type< unsigned int > {
typedef int the_type;
};
template <>
struct signed_type< unsigned long > {
typedef long the_type;
};
template < typename T >
struct unsigned_type {
typedef T the_type;
}; // unsigned_type
template <>
struct unsigned_type< char > {
typedef unsigened char the_type;
};
template <>
struct unsigned_type< signed char > {
typedef unsigened char the_type;
};
template <>
struct unsigned_type< signed short > {
typedef unsigned short the_type;
};
template <>
struct unsigned_type< signed int > {
typedef unsigned int the_type;
};
template <>
struct unsigned_type< signed long > {
typedef unsigned long the_type;
};
}
template < typename ArithmeticType >
class arithmetic_traits {
public:
typedef ArithmeticType value_type;
typedef typename
DO_NOT_USE::signed_type< ArithmeticType >::the_type signed_type;
typedef typename
DO_NOT_USE::unsigned< ArithmeticType >::the_type unsigned_type;
};
Best
Kai-Uwe Bux