У меня есть код на C++, написанный где-то в марте 2023 года. Тогда он нормально компилировался. Теперь мне нужно внести в него несколько изменений, но он больше не компилируется. Используемым языковым стандартом был C++20. Я не помню, какая версия VS тогда использовалась. Он определенно был обновлен до последней версии.
Теперь я получаю сообщение об ошибке «ошибка C3889: вызов объекта типа класса 'std::ranges::_Find_if_fn': соответствующий оператор вызова не найден». при звонке
ranges::find_if(network_list, [](auto const& item) { return item.IsConnected(); })
затем он говорит что-то о «'std::ranges::borrowed_iterator_t': связанные ограничения не удовлетворены», а затем «концепция 'std::ranges::range' оценен как false". Непонятно, что происходит.
Я думаю, что find_if стал более строгим, но я не понимаю, как именно. network_list — это экземпляр пользовательской реализации итерации с методами начала и конца. метод end возвращает дозорный класс. Я предполагаю, что проблема связана с этим, потому что если я изменю вызов на
ranges::find_if(network_list.begin(), network_list.end(), [](auto const& item) { return item.IsConnected(); })
Я получаю другую ошибку, которая почему-то имеет смысл. В нем говорится, что «концепция 'std::sentinel_for' оценена как ложная», затем «концепция 'std::_Weakly_equality_comparable_with' оценена как ложная», а затем «концепция 'std::_Half_equality_comparable ' оценивается как false".
Возможно, моя реализация этой итерации и использование сторожевого класса не следуют определенным правилам, но я не могу найти пример того, как они должны быть. реализовано для работы таких функций, как find_if. Может ли кто-нибудь показать правильный пример?
ОБНОВЛЕНИЕ:
Отвечаем на вопрос о типе network_list. Я подумал, что достаточно заявить, что это собственная реализация iterable. Вот
template
class IterableAsync final {
friend class YieldPromise;
friend class IteratorAsync;
using handle_type = std::coroutine_handle;
private:
handle_type m_objHandle;
public:
// promise_type is expected by STL to be publicly declared
using promise_type = YieldPromise;
private:
explicit IterableAsync(handle_type objHandle) : m_objHandle(std::move(objHandle)) {
}
public:
IterableAsync(IterableAsync const& other) = delete;
IterableAsync(IterableAsync&& other) noexcept :
m_objHandle(other.m_objHandle) {
other.m_objHandle = nullptr;
}
~IterableAsync() {
if(m_objHandle) {
m_objHandle.destroy();
}
}
public:
IteratorAsync begin() {
return IteratorAsync(*this, false);
}
// ReSharper disable once CppMemberFunctionMayBeStatic
IteratorAsyncSentinel end() {
return IteratorAsyncSentinel();
}
public:
IterableAsync& operator =(IterableAsync const& other) = delete;
IterableAsync& operator =(IterableAsync&& other) noexcept {
m_objHandle = other.m_objHandle;
other.m_objHandle = nullptr;
return *this;
}
};
Подробнее здесь: https://stackoverflow.com/questions/783 ... in-find-if
Как написать итерируемый класс со стражем, чтобы использовать его в find_if? ⇐ C++
Программы на C++. Форум разработчиков
1713506119
Anonymous
У меня есть код на C++, написанный где-то в марте 2023 года. Тогда он нормально компилировался. Теперь мне нужно внести в него несколько изменений, но он больше не компилируется. Используемым языковым стандартом был C++20. Я не помню, какая версия VS тогда использовалась. Он определенно был обновлен до последней версии.
Теперь я получаю сообщение об ошибке «ошибка C3889: вызов объекта типа класса 'std::ranges::_Find_if_fn': соответствующий оператор вызова не найден». при звонке
ranges::find_if(network_list, [](auto const& item) { return item.IsConnected(); })
затем он говорит что-то о «'std::ranges::borrowed_iterator_t': связанные ограничения не удовлетворены», а затем «концепция 'std::ranges::range' оценен как false". Непонятно, что происходит.
Я думаю, что find_if стал более строгим, но я не понимаю, как именно. network_list — это экземпляр пользовательской реализации итерации с методами начала и конца. метод end возвращает дозорный класс. Я предполагаю, что проблема связана с этим, потому что если я изменю вызов на
ranges::find_if(network_list.begin(), network_list.end(), [](auto const& item) { return item.IsConnected(); })
Я получаю другую ошибку, которая почему-то имеет смысл. В нем говорится, что «концепция 'std::sentinel_for' оценена как ложная», затем «концепция 'std::_Weakly_equality_comparable_with' оценена как ложная», а затем «концепция 'std::_Half_equality_comparable ' оценивается как false".
Возможно, моя реализация этой итерации и использование сторожевого класса не следуют определенным правилам, но я не могу найти пример того, как они должны быть. реализовано для работы таких функций, как find_if. Может ли кто-нибудь показать правильный пример?
ОБНОВЛЕНИЕ:
Отвечаем на вопрос о типе network_list. Я подумал, что достаточно заявить, что это собственная реализация iterable. Вот
template
class IterableAsync final {
friend class YieldPromise;
friend class IteratorAsync;
using handle_type = std::coroutine_handle;
private:
handle_type m_objHandle;
public:
// promise_type is expected by STL to be publicly declared
using promise_type = YieldPromise;
private:
explicit IterableAsync(handle_type objHandle) : m_objHandle(std::move(objHandle)) {
}
public:
IterableAsync(IterableAsync const& other) = delete;
IterableAsync(IterableAsync&& other) noexcept :
m_objHandle(other.m_objHandle) {
other.m_objHandle = nullptr;
}
~IterableAsync() {
if(m_objHandle) {
m_objHandle.destroy();
}
}
public:
IteratorAsync begin() {
return IteratorAsync(*this, false);
}
// ReSharper disable once CppMemberFunctionMayBeStatic
IteratorAsyncSentinel end() {
return IteratorAsyncSentinel();
}
public:
IterableAsync& operator =(IterableAsync const& other) = delete;
IterableAsync& operator =(IterableAsync&& other) noexcept {
m_objHandle = other.m_objHandle;
other.m_objHandle = nullptr;
return *this;
}
};
Подробнее здесь: [url]https://stackoverflow.com/questions/78351424/how-to-write-iterable-class-with-sentinel-to-use-it-in-find-if[/url]
Ответить
1 сообщение
• Страница 1 из 1
Перейти
- Кемерово-IT
- ↳ Javascript
- ↳ C#
- ↳ JAVA
- ↳ Elasticsearch aggregation
- ↳ Python
- ↳ Php
- ↳ Android
- ↳ Html
- ↳ Jquery
- ↳ C++
- ↳ IOS
- ↳ CSS
- ↳ Excel
- ↳ Linux
- ↳ Apache
- ↳ MySql
- Детский мир
- Для души
- ↳ Музыкальные инструменты даром
- ↳ Печатная продукция даром
- Внешняя красота и здоровье
- ↳ Одежда и обувь для взрослых даром
- ↳ Товары для здоровья
- ↳ Физкультура и спорт
- Техника - даром!
- ↳ Автомобилистам
- ↳ Компьютерная техника
- ↳ Плиты: газовые и электрические
- ↳ Холодильники
- ↳ Стиральные машины
- ↳ Телевизоры
- ↳ Телефоны, смартфоны, плашеты
- ↳ Швейные машинки
- ↳ Прочая электроника и техника
- ↳ Фототехника
- Ремонт и интерьер
- ↳ Стройматериалы, инструмент
- ↳ Мебель и предметы интерьера даром
- ↳ Cантехника
- Другие темы
- ↳ Разное даром
- ↳ Давай меняться!
- ↳ Отдам\возьму за копеечку
- ↳ Работа и подработка в Кемерове
- ↳ Давай с тобой поговорим...
Мобильная версия