Вы не можете использовать weak_ptr
S в качестве ключей, если не используется сравнение владельца на основе (по сравнению со стоимостью на основе одного, что даже не определено для weak_ptr, для которых пытаются использовать оператора < приводит к ошибке) , Проблема в том, что срок их действия может истекать, и порядок ваших контейнеров (set
, а также map
) не будет более последовательным.
Как правильно указано Kerrek SB (простите меня, но мобильное приложение не позволяет мне правильно связывать пользователей), и, как вы можете прочитать из моей ссылки в комментариях, вы можете положиться на std::owner_less
, начиная с C++ 11.
Действительный подход заключается в использовании set
определяется как это следующим образом:
std::set<std::weak_ptr<C>, std::owner_less<std::weak_ptr<C>>>
owner_less
Обратите внимание, что может быть менее многословным, поскольку он автоматически выводит тип.
Имейте в виду, что этот подход не позволяет вам использовать метод expired
во время посещения set
, поскольку он все еще может содержать истекшие объекты, даже если они упорядочены.
Кроме того, обратите внимание, что существует большая разница между просроченным weak_ptr
и пустым, поэтому сравнение с владельцем может быть не таким интуитивно, даже если истечение не должно повлиять на него, когда оно использовалось вышеприведенным подходом.
Heresomelinks.
Не похоже на стандартное значение std :: less на моем gcc для weak_ptrs – Sam
'operator <' похоже, не определено для 'weak_ptr', поэтому' less' не будет работать. – skypjack
Помогло ли это? http://en.cppreference.com/w/cpp/memory/owner_less – skypjack