Как надежно специализировать шаблон с intptr_t в 32- и 64-битных средах? - PullRequest
7 голосов
/ 25 мая 2010

У меня есть шаблон, который я хочу специализировать с двумя типами int, один из которых просто старый int, а другой - intptr_t. На 64-битной платформе они имеют разные размеры, и я могу легко это сделать, но на 32-битных оба типа одинаковы, и компилятор выдает ошибку о переопределении. Что я могу сделать, чтобы это исправить, кроме отключения одного из определений препроцессором?

Пример кода:

template<typename T>
type * convert();

template<>
type * convert<int>() { return getProperIntType(sizeof(int)); }

template<>
type * convert<intptr_t>() { return getProperIntType(sizeof(intptr_t)); }

//this template can be specialized with non-integral types as well, 
// so I can't just use sizeof() as template parameter.
template<>
type * convert<void>() { return getProperVoidType(); }

1 Ответ

2 голосов
/ 25 мая 2010

То, чего вы пытаетесь достичь, в принципе невозможно: intptr_t является typedef для int в 32-битных системах, поэтому компилятор не может их различить. Тем не менее, ваш пример может быть решен, просто специализировав void case:

template<typename T>
type * convert() { return getProperIntType(sizeof(T)); }

template<>
type * convert<void>() { return getProperVoidType(); }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...