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

C++ 将boost::optional与boost::adapters::indirected一起使用,c++,boost,boost-optional,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/al

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

#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;
}
#包括
#包括
#包括
#包括
#包括
#包括
#包括
int main(int argc,字符**argv)
{
使用名称空间boost::assign;
使用boost::adaptors::indirected;
std::向量值;
数值+=1u、2u、3u;
boost::copy(值|间接,std::ostream_迭代器(std::cout,“”);

std::cout查看boost iostreams库中定义的private optional.hpp。您将看到它定义了一个
typedef T元素\u type;

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


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

这肯定是Boost中的一个bug,但该bug是在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;
    };
}
#包括
#包括
名称空间提升
{
模板
结构指针
{
typedef typename可选

::值\类型; }; }

然后根据需要包括其他Boost头文件


请在上提交票证,或者至少在上发布错误报告。

使用include header更好。@Akira:说得好;我忘了它在那里,因为它不在root
boost
目录中,这与大多数其他boost libs的前向声明头不同。重新发现没有人在被告知时报告的错误非常棒。我加入了独立地发现并复制了这一点,从而产生了这一点。@Lars:确实很棒。我也这么做了。但是,正如我在刚刚发布的回答中所引用的,这可能是出于设计:在
详细信息
名称空间中使用类/函数应该是最后的选择;它们被放在那里是因为它们不是专门用于t之外的他给出了图书馆的实施方案。