0

z-orderでソートされたノードのリストがあります(http://en.wikipedia.org/wiki/Z-order_curve)。zPositionよりも大きい最初のノードを見つけようとしています。iterTransformオブジェクトはイテレータを受け取り、バイナリ位置表現(zPositionと同じタイプ)を返します。このタイプはpathCmpで比較できます

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、Iterator、Reference、Value>'から'std :: _ Vector_iterator<_Myvec>'に変換できません

この最小化された例に間違いはありますか、それともより多くのコードを提供する必要がありますか?

4

2 に答える 2

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

想定して動作しbeginendタイプのNodeIterTものです。

于 2012-05-24T14:36:47.240 に答える
2

std::upper_boundパラメータとして与えられたものと同じ型のイテレータを返します。あなたの場合、戻り値の型はしたがってありboost::transform_iterator<...>、ありませんstd::vector<...>::iterator

base()基になる反復子にアクセスする場合は、メンバー関数を使用できます。

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()
于 2012-05-24T14:37:50.343 に答える