我正在尝试编写一个模板,该模板将迭代器作为其参数的任何类型的向量。当我尝试编译以下内容时,它会给我no matching function call
错误。
#include <vector>
struct A { int x; };
template <class T>
void process (typename std::vector<T>::iterator begin,
typename std::vector<T>::iterator end)
{ for(; begin != end; begin++) { /*do_something*/ } }
int main()
{
std::vector <A> obj;
process(obj.begin(), obj.end());
}
答案 0 :(得分:2)
1 无法从参数类型中推断出类型T
。
2 为什么要将函数限制为只接受std::vector
元素的迭代器?如果你真的只想要向量元素,最好把std::vector<T> const&
作为参数。但最好简单地使用任何迭代器参数(或任何容器参数)。
编辑好的,这是一个例子。您可以省略static_assert
,当它变为相同(除了返回类型)到std::for_each(begin,end,do_something);
template <class It>
void process(It begin, const It end)
{
static_assert(std::is_same<typename std::iterator_traits<It>::iterator_category,
std::random_access_iterator_tag>::value,
"arguments not random access iterators");
for (; begin != end; ++begin)
do_something(*begin);
}
答案 1 :(得分:2)
根据OP的要求,见下文。您可以使用任何支持operator *()
的值引用的有效容器转发迭代器。一个vector,deque,list等。这不使用chris提到的静态断言逻辑,我留给你决定。
#include <iostream>
#include <iterator>
template<typename Iterator>
void process(Iterator start, Iterator stop)
{
typedef typename std::iterator_traits<Iterator>::value_type value_type;
for (Iterator it=start; it != stop; ++it)
{
const value_type& val = (*it);
// do something with val
std::cout << val << std::endl;
}
}
int main()
{
int ar[] = { 1,2,3,4,5 };
process(std::begin(ar), std::end(ar));
return 0;
}