首页 > 解决方案 > 无序映射的迭代器向量 - 编译错误

问题描述

各位程序员

我想为满足某些标准的元素创建一个迭代器向量,用于无序映射。我为此编写了一个函数,但它无法编译,而且我不明白代码有什么问题:

class Cache
{
public:
    Cache()
    {}

    template<typename Functor>
    std::vector<Transaction::TransactionsContainer::iterator> getSpecificOrders(Functor criterion) const;

protected:
    Transaction::TransactionsContainer transactions;
};

template<typename Functor>
std::vector<Transaction::TransactionsContainer::iterator> Cache::getSpecificOrders(Functor criterion) const
{
   std::vector<Transaction::TransactionsContainer::iterator> foundOrders;
   for (auto it = transactions.begin(); it != transactions.end(); ++it)
   {
       if (criterion(it->second))
       {
           foundOrders.push_back(it);//this line fails to compile
       }
   }
   return foundOrders;
}

编译器报告转换失败的错误;示例在这里 https://onlinegdb.com/SyHXHFm2P

请解释我做错了什么。

错误信息:

In file included from main.cpp:9:0:
cache.h: In member function ‘std::vector<std::__detail::_Node_iterator<std::pair<const std::basic_string<char>, Transaction::Order>, false, true> > Cache::getSpecificOrders(Functor) const’:
cache.h:25:36: error: no matching function for call to ‘std::vector, Transaction::Order>, false, true> >::push_back(std::__detail::_Node_const_iterator, Transaction::Order>, false, true>&)’
            foundOrders.push_back(it);
                                    ^
In file included from /usr/include/c++/6/vector:64:0,
                 from cache.h:2,
                 from main.cpp:9:
/usr/include/c++/6/bits/stl_vector.h:914:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(const value_type&) [with _Tp = std::__detail::_Node_iterator, Transaction::Order>, false, true>; _Alloc = std::allocator, Transaction::Order>, false, true> >; std::vector<_Tp, _Alloc>::value_type = std::__detail::_Node_iterator, Transaction::Order>, false, true>]
       push_back(const value_type& __x)
       ^~~~~~~~~
/usr/include/c++/6/bits/stl_vector.h:914:7: note:   no known conversion for argument 1 from ‘std::__detail::_Node_const_iterator, Transaction::Order>, false, true>’ to ‘const value_type& {aka const std::__detail::_Node_iterator, Transaction::Order>, false, true>&}’
/usr/include/c++/6/bits/stl_vector.h:932:7: note: candidate: void std::vector<_Tp, _Alloc>::push_back(std::vector<_Tp, _Alloc>::value_type&&) [with _Tp = std::__detail::_Node_iterator, Transaction::Order>, false, true>; _Alloc = std::allocator, Transaction::Order>, false, true> >; std::vector<_Tp, _Alloc>::value_type = std::__detail::_Node_iterator, Transaction::Order>, false, true>]
       push_back(value_type&& __x)
       ^~~~~~~~~
/usr/include/c++/6/bits/stl_vector.h:932:7: note:   no known conversion for argument 1 from ‘std::__detail::_Node_const_iterator, Transaction::Order>, false, true>’ to ‘std::vector, Transaction::Order>, false, true> >::value_type&& {aka std::__detail::_Node_iterator, Transaction::Order>, false, true>&&}’

标签: c++stlcontainers

解决方案


getSpecificOrders被宣布const;因此transactions在该函数中是一个const对象;因此transactions.begin()返回Transaction::TransactionsContainer::const_iterator。您正在尝试将其添加到 的向量中Transaction::TransactionsContainer::iterator,但前者不可转换为后者。


推荐阅读