Название - для привлечения внимания, теперь по существу :)
Есть код:
template <typename T> void foo(T value) { if ( value < 0) { ... } else { ... } } ... { foo<int>( 100500); // при инстанцировании - все ок foo<unsigned int>( 100500); // при инстанцировании - предупрежедние о том, что сравнение `< 0` для беззнаковых типов всегда равно false }
Как убрать это предупреждение, не специализируя явно шаблон?
Правка: не холивар
msdn #pragma warning disable
ps. для msvc
О да :)
Я имел ввиду логический уровень - как переписать код, а не выключить предупрежедение.
Sergio
template <typename T> void foo(T value) { if ( value >= 0) { ... } else { ... } }
Хм.... по-моему, это крутое решение :)
Правка: которое выдает предупреждение warning: comparison of unsigned expression >= 0 is always true [-Wtautological-compare,2]
Sergio
Возможно как-то разделить 0 и больше нуля?
if(value && value > 0)
не проверял :)
Sergio
Может так ( намного длиннее, зато гибкий ;-) )
class tInt { public: bool cond () { if ( i < 0) return false; return true; } private: int i; } class tUInt { public: bool cond ( ) { return true; } private: unsigned int i; } void foo( T value) { if ( value.cond( ) ) { ... } else { ... } }
L1f
> if(value && value > 0)
Да, это решает!
vap
int от -2^31 до 2^31
unsigned int от 0 до 2^32
следовательно, при числах unsigned int , больше 2^31 будет такая же реакция, как и на отрицательное число
А черт, не заметил что оно на проверку больше нуля тоже варнинг кидает.
А зачем?
> if(value && value > 0)
но тогда это (0; +inf)
http://www.gamedev.ru/industry/forum/?id=151170&page=5#m62
про это чтоли ? :)
Тема в архиве.