简体   繁体   English

错误:向量迭代器不兼容

[英]error: vector iterators incompatible

This is the line which causes the error 这是导致错误的行

vector<transform>::iterator transformIter;
    for (transformIter = (*objIter)->transforms.begin(); transformIter != (*objIter)->transforms.end(); objIter++) {
                    handleTransform((*transformIter));
                }

It occurs on the second iteration of the loop regardless of how many transofrms are in the vector. 无论向量中有多少跨函数,它都会在循环的第二次迭代中发生。

The obj struct looks like this: obj结构如下所示:

struct obj {

    vector<glm::vec4> vertices;
    vector<int> elements;
    vector<object> objects;
    vector<transform> transforms;


};

and the function handleTransform is: 而handleTransform函数是:

void handleTransform(transform currentTransform) {

    if (currentTransform.type == 'r') {
        glRotatef(currentTransform.coordinates.x, 1.0f, 0.0f, 0.0f);
        glRotatef(currentTransform.coordinates.y, 0.0f, 1.0f, 0.0f);
        glRotatef(currentTransform.coordinates.z, 0.0f, 0.0f, 1.0f);
    }

    if (currentTransform.type == 's') {
        glScalef(currentTransform.coordinates.x, currentTransform.coordinates.y, currentTransform.coordinates.z);
    }

    if (currentTransform.type == 't') {
        glTranslatef(currentTransform.coordinates.x, currentTransform.coordinates.y, currentTransform.coordinates.z);
    }

}

Iterating through the other vectors in an obj doesn't cause any vector issues, so I have to imagine it's something to do with the handleTransform function, but I can't figure it out. 遍历obj中的其他向量不会导致任何向量问题,因此我不得不想象这与handleTransform函数有关,但我无法弄清楚。

You are erroneously incrementing objIter , not transformIter : 您错误地增加objIter ,而不是transformIter

for (transformIter = (*objIter)->transforms.begin(); 
     transformIter != (*objIter)->transforms.end(); 
     objIter++) // ??

It should be: 它应该是:

for (transformIter = (*objIter)->transforms.begin(); 
     transformIter != (*objIter)->transforms.end(); 
     ++transformIter) 

To avoid mistakes like this, use std::for_each , or if using C++ 11, a ranged-based for loop: 为避免此类错误,请使用std::for_each ,或者如果使用C ++ 11,则是基于范围的for循环:

http://en.cppreference.com/w/cpp/language/range-for http://en.cppreference.com/w/cpp/language/range-for

With either of these options, you eliminate the need to declare iterators, make mistakes iterating to the next item, or if not those issues, perform a post-increment instead of a faster pre-increment of the iterator (as your original code is doing). 使用这些选项中的任何一个,您都无需声明迭代器,在迭代到下一个项目时犯错误,或者如果不是这些问题,则执行后递增而不是更快的预递增迭代器(如原始代码所做的那样) )。

++transformIter替换objIter++

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM