对于unique_ptr的向量的解引用包装器?

时间:2018-01-10 16:18:41

标签: c++11 vector iterator wrapper unique-ptr

我最近遇到了这个article;它提供了boost indirect_iterator的基本实现,但是对于unique_ptr迭代器。我决定稍微调整文章中的示例,以便我可以将它用于类成员之外的向量:

template <typename T>
using SPN = std::unique_ptr<Node<T>>;

template <class BaseIterator>
struct DReferenceIterator : BaseIterator
{
  explicit DReferenceIterator(const BaseIterator & other) : BaseIterator(other) {}
  auto & operator*() const { return *(this->BaseIterator::operator*()); }
  auto * operator->() const { return this->BaseIterator::operator*().get(); }
  auto & operator[](size_t n) const { return *(this->BaseIterator::operator[](n)); }
};

template<typename T>
auto begin_t(std::vector<SPN<T>> & v) 
{
  return DReferenceIterator<typename std::vector<SPN<T>>::iterator>(v.begin());
}

template<typename T>
auto end_t(std::vector<SPN<T>> & v) 
{
  return DReferenceIterator<typename std::vector<SPN<T>>::iterator>(v.end());
}

我可以毫无问题地使用std::find(begin_t(v), end_t(v), value)。但是,如果我尝试拨打std::sort(begin_t(v), end_t(v)),它根本不起作用。我确实在operator<()类中提供了Node<T>的实现,但由于某种原因,我的代码无法编译。我得到的编译错误非常广泛且难以阅读,但是,我设法提取了一些我认为导致问题的内容:

  

二进制=:找不到哪个运算符采用std::unique_ptr<Node<float>,std::default_delete<_Ty>>类型的右手操作数(或者没有可接受的转换)

此消息是否表示std::sort()正在尝试复制unique_ptr?在这种情况下,这是否意味着DReferenceIterator包装器不能按预期工作?我是C ++的新手,所以如果不是这样,请帮助我理解问题到底是什么。

1 个答案:

答案 0 :(得分:4)

你的firebaseRefTODRIVERID.child("Latlng").once("value", snap => { console.log(snap.val()) }) 正在向标准库说谎它正在暴露什么。这导致您看到的错误DReferenceIterator通过它。

std::sort派生,您继承了以下(以及其他)BaseIteratorBaseIterator::value_typeBaseIterator::pointer,它们与您{的返回类型不匹配{1}}秒。

正确的实施更像是

BaseIterator::reference