C++ 迭代器的基于范围的循环-为什么这样抱怨?

C++ 迭代器的基于范围的循环-为什么这样抱怨?,c++,c++11,iterator,C++,C++11,Iterator,基本上,我有一个二维向量: std::vector<std::vector<double> > vect = { {1, 2, 3}, {4, 5, 6}, {7, 8, 9} }; 有关详细信息,请参阅帖子后面的评论 template<typename Inverse> void Diag(Inverse begin, Inverse end) { for(auto row = begin; row != end; row

基本上,我有一个二维向量:

std::vector<std::vector<double> > vect = {
    {1, 2, 3},
    {4, 5, 6}, 
    {7, 8, 9}
};

有关详细信息,请参阅帖子后面的评论

template<typename Inverse>
void Diag(Inverse begin, Inverse end)
{
    for(auto row = begin; row != end; row++)
    {
        for(auto col : *row)
        {

        }
    }
}
模板
无效诊断(反向开始,反向结束)
{
对于(自动行=开始;行!=结束;行++)
{
用于(自动列:*行)
{
}
}
}

在这个回答中,我忽略了一个事实,即错误消息来自与您向我们展示的代码不同的代码段。但是,将(自动行:&begin)的
更改为(自动行:begin)
就足够恢复同步了

问题是ranged for需要一个容器,但您为它提供了一个迭代器,但最简单的解决方案是简单地用一个更传统的环路交换外部量程

出于性能考虑,也不要忘记通过引用进行迭代:

#include <vector>
#include <iostream>

std::vector<std::vector<double> > vect = {
    {1, 2, 3},
    {4, 5, 6}, 
    {7, 8, 9}
};

template<typename Inverse>
void Diag(Inverse begin, Inverse end)
{
    for(auto it = begin; it != end; ++it)
        for(auto& col : *it)
            std::cout << col << ' ';
}

int main()
{
    Diag(std::begin(vect), std::end(vect));
}
#包括
#包括
标准::向量向量={
{1, 2, 3},
{4, 5, 6}, 
{7, 8, 9}
};
模板
无效诊断(反向开始,反向结束)
{
for(自动it=开始;it!=结束;++it)
用于(自动和列:*it)

std::cout谁抱怨了?你的妻子?@thang编译器,抱歉哈哈!发布编译器的准确错误消息。@thang更新了我的帖子:)你不想从头到尾吗?begin不是集合,所以你不能像(自动行:begin)那样使用集合循环请把这些评论带到你的答案中。评论会在任何时候消失。无论如何,我看不到任何“细节”。。。
template<typename Inverse>
void Diag(Inverse begin, Inverse end)
{
    for(auto row = begin; row != end; row++)
    {
        for(auto col : *row)
        {

        }
    }
}
#include <vector>
#include <iostream>

std::vector<std::vector<double> > vect = {
    {1, 2, 3},
    {4, 5, 6}, 
    {7, 8, 9}
};

template<typename Inverse>
void Diag(Inverse begin, Inverse end)
{
    for(auto it = begin; it != end; ++it)
        for(auto& col : *it)
            std::cout << col << ' ';
}

int main()
{
    Diag(std::begin(vect), std::end(vect));
}