错误:矢量迭代器不兼容

时间:2015-03-15 17:46:17

标签: c++ opengl vector iterator

这是导致错误的行

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

它发生在循环的第二次迭代中,无论向量中有多少个transofrms。

obj结构如下所示:

struct obj {

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


};

并且函数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);
    }

}

迭代obj中的其他向量不会导致任何向量问题,所以我必须想象它与handleTransform函数有关,但我无法弄明白。

2 个答案:

答案 0 :(得分:1)

您错误地增加了objIter,而不是transformIter

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

应该是:

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

为了避免这样的错误,请使用std::for_each,或者如果使用C ++ 11,则使用基于范围的for循环:

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

使用这些选项中的任何一个,您就不需要声明迭代器,将错误迭代到下一个项目,或者如果不是那些问题,则执行后增量而不是更快的迭代器预增量(作为原始代码正在做)。

答案 1 :(得分:1)

objIter++替换为++transformIter