2012-05-24 56 views
0

我有一個按z順序排列的節點列表(http://en.wikipedia.org/wiki/Z-order_curve)。 我想找到比zPosition更大的第一個節點。 iterTransform對象接受一個迭代器並返回一個二進制位置表示(與zPosition類型相同)。這種類型可以通過pathCmpboost :: transform_iterator在std :: upper_bound編譯錯誤

NodeIterT last = std::upper_bound(
    boost::make_transform_iterator(begin, iterTransform), // return PathType 
    boost::make_transform_iterator(end, iterTransform), 
    zPosition, 
    pathCmp); // takes two PathType arguments 

編譯這個當我

進行比較

錯誤C2440:初始化:不能從轉換 '的boost :: transform_iterator < UnaryFunc,迭代器,參考值>' 到「 std :: _ Vector_iterator < _Myvec>'

這個最小化示例中是否有任何錯誤,或者是否需要提供更多的代碼?

回答

2

std::upper_bound返回transform_iterator。添加.base()讓你包裹迭代器類型:

NodeIterT last = std::upper_bound(
boost::make_transform_iterator(begin, iterTransform), // return PathType 
boost::make_transform_iterator(end, iterTransform), 
zPosition, 
pathCmp).base(); 

應該努力承擔beginendNodeIterT類型。

2

std::upper_bound返回一個與給定參數相同類型的迭代器。在你的情況下,返回類型因此是boost::transform_iterator<...>而不是std::vector<...>::iterator

如果你想訪問底層的迭代器,你可以使用base() member function

NodeIterT last = std::upper_bound(
    boost::make_transform_iterator(begin, iterTransform), // return PathType 
    boost::make_transform_iterator(end, iterTransform), 
    zPosition, 
    pathCmp).base(); // note the call to base()