Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ c++;'std::vector<;的模板函数的正确语法;T>;::迭代器`_C++_Templates_Iterator - Fatal编程技术网

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,因为我想让你明白你的值类型是如何可以引用的。这只是为了视觉(你的)。