9

私は次のコードをコンパイルしようとしています:

#include <iostream>
#include <iterator>
#include <vector>

#include <boost/assign/std/vector.hpp>
#include <boost/optional.hpp>
#include <boost/range/adaptor/indirected.hpp>
#include <boost/range/algorithm/copy.hpp>

int main( int argc, char ** argv )
{
  using namespace boost::assign;
  using boost::adaptors::indirected;

  std::vector<boost::optional<unsigned> > values;
  values += 1u,2u,3u;
  boost::copy( values | indirected, std::ostream_iterator<unsigned>( std::cout, " " ) );
  std::cout << std::endl;
}

element_typeただし、で名前が付けられたタイプがないなど、いくつかのエラーが発生しましたboost::optional<unsigned>ただし、リファレンスページのページには、operator*()単項関数の存在が唯一の前提条件であると記載されています。それを機能させる方法はありますか?

4

2 に答える 2

7

これは間違いなく Boost のバグですが、そのバグが Boost.Optional にあるのか Boost.Iterator にあるのかは議論の余地があります (個人的には後者だと思います)。

ただし、修正は簡単です。Boost ヘッダーを含める前に、次のようにします。

#include <boost/optional/optional_fwd.hpp>
#include <boost/pointee.hpp>

namespace boost
{
    template<typename P>
    struct pointee<optional<P> >
    {
        typedef typename optional<P>::value_type type;
    };
}

次に、必要に応じて他の Boost ヘッダーを含めます。

Boost Tracにチケットを送信するか、少なくともBoost Users メーリング リストにバグ レポートを投稿してください。

于 2011-05-25T18:27:27.370 に答える
1

こちらのブースト iostreams ライブラリで定義されているプラ​​イベートな optional.hpp を見てください。を定義していることがわかります。typedef T element_type;

ただし、ここで定義されている実際の optional.hpp はそれを定義していません。そのため、コンパイラは不平を言っています。なぜ見落とされたのかはわかりません。

この問題を解決するには、iostreams ライブラリの private optional.hpp を使用してみてください。これが役立つことを願っています。

于 2011-05-25T11:30:29.460 に答える