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