将boost :: optional与boost :: adapters :: indirected一起使用

时间:2011-05-25 10:55:22

标签: c++ boost boost-optional

我正在尝试编译以下代码:

#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>的类型。但是,reference page页面表示单个前提条件是operator*()一元函数的存在。有没有办法让它发挥作用?

2 个答案:

答案 0 :(得分: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 mailing list上发布错误报告。

答案 1 :(得分:1)

查看boost iostreams库here中定义的private optional.hpp。您将看到它定义了typedef T element_type;

但是,您使用的实际optional.hpp here未定义它。这就是编译器抱怨的原因。我不知道为什么会被忽视。

尝试使用iostreams库中的private optional.hpp来解决此问题。我希望这会有所帮助。