АШ> if (source.size() > std::distance(first, last)) // ok
Так нет же, предупреждение не исчезло никуда. Что впрочем не удивительно, поскольку distance возвращает difference_type, то есть тот же тип, что и у выражения last — first.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Анатолий Широков, Вы писали:
I>
АШ>> if (source.size() > std::distance(first, last)) // ok
I>
I>Так нет же, предупреждение не исчезло никуда. Что впрочем не удивительно, поскольку distance возвращает difference_type, то есть тот же тип, что и у выражения last — first.
Сорри, поторопился. Тогда я предлагаю сделать ход конем:
template <class CONT, class FI>
bool my_copy(CONT const& source, FI first, FI last)
{
if (std::distance(source.begin(), source.end()) > std::distance(first, last)) // ok?return false;
copy(source.begin(), source.end(), first);
return true;
}
difference_type — это знаковый тип (см. таблицу 65), а size_type — беззнаковый (та же таблица 65). Так что без явного каста даже и с std::difference предупреждение не побороть. Тем более что
size_type can represent any non-negative value of difference_type
Та же таблица 65.
В общем можно как-то вот так:
if (source.size() > (CONT::size_type)std::distance(first, last)) // ok
Здравствуйте, Were, Вы писали:
W>Здравствуйте, igna, Вы писали:
I>>Как без использования #pragma warning изменить нижеприведенный пример, чтобы избавиться от предупреждения?
W>Я бы сделал так: W>
W>if ( last < first || source.size() > static_cast< CONT::size_type >( last - first ))
W> return false;
W>
Далеко не для всех типов итераторов определен operator <
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Were, Вы писали:
W>>Здравствуйте, igna, Вы писали:
I>>>Как без использования #pragma warning изменить нижеприведенный пример, чтобы избавиться от предупреждения?
W>>Я бы сделал так: W>>
W>>if ( last < first || source.size() > static_cast< CONT::size_type >( last - first ))
W>> return false;
W>>
B>Далеко не для всех типов итераторов определен operator <
operator -, кстати, тоже. И, скорее всего, это одни и те же итераторы )
B>if (source.size() > (CONT::size_type)std::distance(first, last)) // ok
Всегда ли sizeof(FI::difference_type) будет не больше sizeof(CONT::size_type)? Ведь можно написать STL complient container size_type которого будет к примеру unsigned short.
Здравствуйте, igna, Вы писали:
I>Здравствуйте, Bell, Вы писали:
I>
B>>if (source.size() > (CONT::size_type)std::distance(first, last)) // ok
I>
I>Всегда ли sizeof(FI::difference_type) будет не больше sizeof(CONT::size_type)? Ведь можно написать STL complient container size_type которого будет к примеру unsigned short.
Я же уже писал:
size_type can represent any non-negative value of difference_type
Этому требованию должны удовлетворять все стандартные контейнеры — смотри таблицу 65 в 23.1.
... B>difference_type — это знаковый тип (см. таблицу 65), а size_type — беззнаковый (та же таблица 65). Так что без явного каста даже и с std::difference предупреждение не побороть. Тем более что B>
B>size_type can represent any non-negative value of difference_type
B>Та же таблица 65.
B>В общем можно как-то вот так: B>
B>if (source.size() > (CONT::size_type)std::distance(first, last)) // ok
B>