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_typeboost::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

在此处查看boost iostreams 库中定义的私有 optional.hpp 。你会看到它定义了一个typedef T element_type;

但是,您在此处定义的实际 optional.hpp并未对其进行定义。这就是编译器抱怨的原因。我不知道为什么它被忽略了。

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

于 2011-05-25T11:30:29.460 回答