迭代器向量到无序映射 - 编译错误
Vector of iterators to unordered map - compilation error
各位程序员大家好
我想为满足某些条件的元素创建一个迭代器向量到无序映射。我已经为此编写了一个函数,但它无法编译,而且我不明白代码有什么问题:
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>&&}’
getSpecificOrders
声明为 const
;因此该函数中的 transactions
是一个 const
对象;因此 transactions.begin()
returns Transaction::TransactionsContainer::const_iterator
。您正在尝试将其添加到 Transaction::TransactionsContainer::iterator
的向量中,但前者不能转换为后者。
各位程序员大家好
我想为满足某些条件的元素创建一个迭代器向量到无序映射。我已经为此编写了一个函数,但它无法编译,而且我不明白代码有什么问题:
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>&&}’
getSpecificOrders
声明为 const
;因此该函数中的 transactions
是一个 const
对象;因此 transactions.begin()
returns Transaction::TransactionsContainer::const_iterator
。您正在尝试将其添加到 Transaction::TransactionsContainer::iterator
的向量中,但前者不能转换为后者。