Сравнение двух наборов std :: weak_ptr

Я пытаюсь сравнить два набора C ++ 11 weak_ptr с использованием GCC 4.7.2. Код ниже показывает наименьший возможный образец, воспроизводящий ошибку:

std::set<std::weak_ptr<int>, std::owner_less<std::weak_ptr<int> > > set1;
std::set<std::weak_ptr<int>, std::owner_less<std::weak_ptr<int> > > set2;

bool result = (set1 == set2);

Попытка скомпилировать приведенные выше результаты приводит к длинному списку ошибок, из которых следующее является первой фактической ошибкой:

/usr/include/c++/4.7/bits/stl_algobase.h:791:6: error: no match for ‘operator==’ in ‘__first1.std::_Rb_tree_const_iterator<_Tp>::operator*<std::weak_ptr<int> >() == __first2.std::_Rb_tree_const_iterator<_Tp>::operator*<std::weak_ptr<int> >()’

Из-за переходного характера weak_ptr, сравнение всего их набора просто невозможно?

Обновить:

Одним из предложений является использование:

bool result = !((set1 < set2) || (set2 < set1))

Это приводит к:

/usr/include/c++/4.7/bits/stl_algobase.h:882:6: error: no match for ‘operator<’ in ‘__first1.std::_Rb_tree_const_iterator<_Tp>::operator*<std::weak_ptr<int> >() < __first2.std::_Rb_tree_const_iterator<_Tp>::operator*<std::weak_ptr<int> >()’

4

Решение

Так как weak_ptr не поддерживает ‘==’, но в этом случае вы можете использовать оператор сравнения набора try:

bool result = !(std::lexicographical_compare(set1.begin(), set1.end(),
set2.begin(), set2.end(),
set1.value_comp()) ||
std::lexicographical_compare(set2.begin(), set2.end(),
set1.begin(), set1.end(),
set1.value_comp()));

Это будет проверять эквивалентность, а не равенство. И ему не хватает определенной … ясности.

4

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]