Неверная ошибка инициализации - PullRequest
4 голосов
/ 20 марта 2011

У меня есть класс с закрытым членом std::set<Segment*> mSegments и следующий метод:

std::pair<iterator, iterator> getSegments() {
    return boost::tie(mSegments.begin(), mSegments.end());
}

и я получаю следующую ошибку:

неверная инициализация неконстантныхссылка типа std::_Rb_tree_const_iterator<Segment*>& из временного типа std::_Rb_tree_const_iterator<Segment*>

Я не уверен, как решить эту проблему.Может кто-нибудь сказать мне, в чем проблема?

Ответы [ 4 ]

5 голосов
/ 20 марта 2011

Я думаю, что ваша проблема в том, что вы, вероятно, должны использовать make_pair здесь вместо tie.Смысл tie состоит в том, чтобы позволить функциям, которые возвращают кортежи, возвращать возвращаемое значение нескольким значениям одновременно.Например, если Get3DPoint возвращает tuple<int, int, int>, вы можете написать

int x, y, z;
tie(x, y, z) = Get3DPoint();

. Из-за этого tie всегда принимает свои параметры не по ссылке const, чтобы их можно было изменить,В вашем случае возвращаемые значения begin() и end() являются временными, поэтому они не могут быть привязаны к ссылкам, отличным от const.

make_pairmake_tuple), вс другой стороны, они рассчитаны на несколько значений и упаковывают их в один объект pair или tuple, который можно передавать.Это то, что вы хотите использовать в своей функции.Если вы измените код на

std::pair<iterator, iterator> getSegments() {
    return std::make_pair(mSegments.begin(), mSegments.end());
}

, тогда ваш код должен хорошо скомпилироваться.

Надеюсь, это поможет!

3 голосов
/ 20 марта 2011

У меня нет большого опыта работы с boost::tie, но, глядя на сообщение об ошибке, я могу сказать, что ошибка в том, что вы пытаетесь связать временную ссылку с неконстантной ссылкой.

Временные ссылки не могут быть связаны со ссылками на неконстантные объекты.

Например

 Myclass &ref = Myclass(); // ill formed
0 голосов
/ 20 марта 2011

Это объявление связи:

template <class A, class B> tied<A,B> tie(A& a, B& b);

И это объявление begin (end):

iterator begin()

Это означает, что begin () возвращает временный объект (не ссылкуэто), который не может пройти, чтобы связать.

0 голосов
/ 20 марта 2011
Параметры

boost::tie являются неконстантными ссылками, но begin и end возвращают временные значения. Вам нужно их где-то хранить, чтобы это работало.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...