2011-03-20 181 views
4

我有一個私有成員std::set<Segment*> mSegments類和下面的方法:無效初始化錯誤

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

,我得到以下錯誤:

invalid initialization of non-const reference of type std::_Rb_tree_const_iterator<Segment*>& from a temporary of type std::_Rb_tree_const_iterator<Segment*>

我不知道如何解決這個問題一。誰能告訴我問題是什麼?

回答

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()); 
} 

那麼你的代碼應該編譯就好了。

希望這會有所幫助!

3

我對boost::tie沒有太多經驗,但通過查看錯誤消息,我可以說錯誤是因爲您試圖將臨時綁定到非常量引用。

臨時不能綁定到對非const對象的引用。

例如

Myclass &ref = Myclass(); // ill formed 
0

boost::tie的參數都是非const引用,但beginend回報臨時工。你需要將它們存儲在某個地方纔能工作。

0

這是領帶的聲明:

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

這是開始的聲明(結束):

iterator begin() 

這意味着開始()返回臨時對象(未引用它),這不能傳遞給領帶。