2013-06-29 2 views
1

Я использую Eigen3 2-мерный вектор в виде 2D точки для рисования OpenGL:указатель или ссылка на STD :: список Eigen3 вектора

typedef Eigen::Vector2d Vec2D; 

Тогда у меня есть std::list с вектором, и я это повторяется для таким образом:

std::list<Vec2D>::const_iterator it; 
for(it=points.begin(); it!=points.end(); ++it) { 
    Vec2D p = *it; 
    ... // something for draw (p.x(), p.y()) 
} 

, но в этом случае переменная p содержит копию, верно? Теперь .. Я не хочу, чтобы ненужные копии, поэтому я попытался с указателями:

std::list<Vec2D>::const_iterator it; 
for(it=points.begin(); it!=points.end(); ++it) { 
    Vec2D *p = &((Vec2D)*it); 
    ... // something for draw (p->x(), p->y()) 
} 

я нашел странный синтаксис & * это this answer и она работает, даже если я должен был использовать бросок (дон Не знаю, почему, но он не компилировался иначе).

Но я хотел бы использовать ссылку вместо указателя:

std::list<Vec2D>::const_iterator it; 
for(it=points.begin(); it!=points.end(); ++it) { 
    Vec2D &p = ??? 
    ... // something for draw (p->x(), p->y()) 
} 

Но я застрял на какой-то компиляции ошибки, как

invalid initialization of non-const reference of type 'Vec2D&' from a temporary of type 'Vec2D' 

или что-то еще, что я не могу понять ..

+0

Вы попробовали 'const Vec2D & p = * it;'? –

+0

OMG. Но вы меняете ссылку? – Immueggpain

+0

нет Я не меняю это Я только читаю x() и y() – nkint

ответ

1

Вы фактически не показывали нам, что вы пробовали. Судя по сообщению об ошибке, это выглядит, как вы делали

Vec2D &p = ((Vec2D)*it); 

напечатанный (Vec2D) удаляет ссылочный-ность выражения *it. В официальной терминологии она становится rvalue.

Решение прост.

Vec2D &p = *it; // no cast. 

неконстантная ссылка должна связываться с именующим, то, что может появиться на левой стороне =, поскольку ссылка может быть использована таким образом. Но

(Vec2D) *it = ...; // Can't assign the result of a cast expression. 

Просто для полноты картины, C++ действительно позволяет присвоить результат гипса для ссылки типа.

(Vec2D &) *it = ...; // Cast to ref type produces an lvalue. 
+0

Я думаю, что 'const Vec2D' потребуется, так как это' const_iterator'. Не уверен, хотя? –

+0

он получает: 'недопустимая инициализация ссылки типа Vec2D & 'из выражения типа' const Eigen :: Matrix '' – nkint

+0

, но с const это нормально! благодаря! – nkint

Смежные вопросы