我有一个私有成员std::set<Segment*> mSegments
的课程和以下方法:
std::pair<iterator, iterator> getSegments() {
return boost::tie(mSegments.begin(), mSegments.end());
}
我收到以下错误:
从临时类型初始化类型
std::_Rb_tree_const_iterator<Segment*>&
的非const引用std::_Rb_tree_const_iterator<Segment*>
我不确定如何解决这个问题。谁能告诉我这是什么问题?
答案 0 :(得分:5)
我认为您的问题是您可能应该使用make_pair
而不是tie
。 tie
的要点是允许返回元组的函数将返回值一次分配给多个值。例如,如果Get3DPoint
返回tuple<int, int, int>
,那么您可以编写
int x, y, z;
tie(x, y, z) = Get3DPoint();
因此,tie
始终通过非const
引用接受其参数,以便它们可以进行变异。在您的情况下,begin()
和end()
的返回值是临时值,因此它们不能绑定到非const
引用。
make_pair
(和make_tuple
)旨在获取多个值,并将它们打包成一个pair
或tuple
对象,传了过来。这是您要在函数中使用的内容。如果您将代码更改为
std::pair<iterator, iterator> getSegments() {
return std::make_pair(mSegments.begin(), mSegments.end());
}
然后你的代码应该编译得很好。
希望这有帮助!
答案 1 :(得分:3)
我对boost::tie
没有多少经验,但通过查看错误消息,我可以说错误是因为您尝试将临时绑定到非const引用。
Temporaries不能绑定到对非const对象的引用。
例如
Myclass &ref = Myclass(); // ill formed
答案 2 :(得分:0)
boost::tie
的参数是非const引用,但begin
和end
返回临时值。您需要将它们存储在某处以便工作。
答案 3 :(得分:0)
这是领带声明:
template <class A, class B> tied<A,B> tie(A& a, B& b);
这是开始(结束)的声明:
iterator begin()
这意味着begin()返回无法传递给tie的临时对象(不是对它的引用)。