初始化错误无效

时间:2011-03-20 09:37:21

标签: c++ iterator

我有一个私有成员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*>

我不确定如何解决这个问题。谁能告诉我这是什么问题?

4 个答案:

答案 0 :(得分:5)

我认为您的问题是您可能应该使用make_pair而不是tietie的要点是允许返回元组的函数将返回值一次分配给多个值。例如,如果Get3DPoint返回tuple<int, int, int>,那么您可以编写

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

因此,tie始终通过非const引用接受其参数,以便它们可以进行变异。在您的情况下,begin()end()的返回值是临时值,因此它们不能绑定到非const引用。

另一方面,

make_pair(和make_tuple)旨在获取多个值,并将它们打包成一个pairtuple对象,传了过来。这是您要在函数中使用的内容。如果您将代码更改为

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引用,但beginend返回临时值。您需要将它们存储在某处以便工作。

答案 3 :(得分:0)

这是领带声明:

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

这是开始(结束)的声明:

iterator begin()

这意味着begin()返回无法传递给tie的临时对象(不是对它的引用)。