У меня есть шаблон, который я хочу специализировать с двумя международными типами, одним из них простой 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(); }
То, что вы пытаетесь достичь, в принципе невозможно: intptr_t - это typedef для int в 32-битных системах, поэтому компилятор не может их различить. Однако ваш пример можно решить, просто выделив пустой случай:
template<typename T>
type * convert() { return getProperIntType(sizeof(T)); }
template<>
type * convert<void>() { return getProperVoidType(); }