C++ c++;'std::vector<;的模板函数的正确语法;T>;::迭代器`
我试图编写一个模板,该模板将任何类型的向量的迭代器作为其参数。当我试图编译下面的代码时,它给出了一个C++ c++;'std::vector<;的模板函数的正确语法;T>;::迭代器`,c++,templates,iterator,C++,Templates,Iterator,我试图编写一个模板,该模板将任何类型的向量的迭代器作为其参数。当我试图编译下面的代码时,它给出了一个无匹配函数调用的错误 #include <vector> struct A { int x; }; template <class T> void process (typename std::vector<T>::iterator begin, typename std::vector<T>::iterator e
无匹配函数调用的错误
#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());
}
#包括
结构A{int x;};
模板
void进程(typename std::vector::iterator begin,
typename std::vector::迭代器(结束)
{for(;begin!=end;begin++){/*做某事*/}
int main()
{
std::向量obj;
进程(obj.begin(),obj.end());
}
1无法从参数类型推断类型T
2为什么要将函数限制为只接受std::vector
元素的迭代器?如果您确实只需要向量元素,最好将std::vector const&
作为参数。但最好只接受任何迭代器参数(或任何容器参数)
编辑好的,下面是一个例子。当static\u assert与std::for_each(begin、end、do_something)相同时(除了返回类型),可以省略static\u assert
代码>
模板
作废流程(开始、持续、结束)
{
静态断言(std::is_same::value,
“参数不是随机访问迭代器”);
for(;begin!=end;++begin)
做某事(*开始);
}
1无法从参数类型推断类型T
2为什么要将函数限制为只接受std::vector
元素的迭代器?如果您确实只需要向量元素,最好将std::vector const&
作为参数。但最好只接受任何迭代器参数(或任何容器参数)
编辑好的,下面是一个例子。当static\u assert与std::for_each(begin、end、do_something)相同时(除了返回类型),可以省略static\u assert
代码>
模板
作废流程(开始、持续、结束)
{
静态断言(std::is_same::value,
“参数不是随机访问迭代器”);
for(;begin!=end;++begin)
做某事(*开始);
}
根据OP的要求,见下文。您可以使用任何有效的容器前向迭代器,该迭代器支持来自操作符*()
的值引用,即向量、deque、列表等。这不使用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;
}
#包括
#包括
模板
无效进程(迭代器开始、迭代器停止)
{
typedef typename std::迭代器特征::值类型值类型;
for(迭代器it=start;it!=stop;++it)
{
常量值类型&val=(*it);
//对瓦尔做点什么
std::cout根据OP的请求,请参见下文。您可以使用任何有效的容器前向迭代器,该迭代器支持来自操作符*()
的值引用,即向量、deque、列表等。这不使用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;
}
#包括
#包括
模板
无效进程(迭代器开始、迭代器停止)
{
typedef typename std::迭代器特征::值类型值类型;
for(迭代器it=start;it!=stop;++it)
{
常量值类型&val=(*it);
//对瓦尔做点什么
std::为什么不能将其限制为容器?如果可行,请使用随机访问迭代器。简短版本:没有正确的语法-无法从嵌套类型推断模板参数。此问题有6万亿个重复项。有什么特殊原因吗?您没有将迭代器类型本身作为模板参数,并使用基础值类型使用iterator_traits?@MattMunson提取,标准算法通常采用typename Iter
作为迭代器类型,如果不兼容,则会抛出500行错误。如果您想要一个好的错误,可以使用std::iterator_traits::iterator_type
或类似的东西放入static_assert
。为什么要将其限制为容器?如果可行,请使用随机访问迭代器。简短版本:没有正确的语法-无法从嵌套类型推断模板参数。此问题有6万亿个重复项。是否有特殊原因,您没有将迭代器类型本身作为模板参数,并使用迭代器提取基础值类型raits?@MattMunson,标准算法通常采用typename Iter
作为迭代器类型,如果不兼容,则会抛出500行错误。如果您想要一个好的错误,可以使用std::iterator\u traits::iterator\u type
或类似的方法放入静态断言打开?你能为你的第二个解决方案发布代码吗?为什么不干脆做std::cout@MattMunson,因为我想让你明白你的值类型是如何可以引用的。这只是为了视觉(你的)。为什么不干脆做std::cout@MattMunson,因为我想让你明白你的值类型是如何可以引用的。这只是为了视觉(你的)。