【问题标题】:Use boost::optional together with boost::adaptors::indirected将 boost::optional 与 boost::adaptors::indirected 一起使用
【发布时间】:2011-05-25 10:55:22
【问题描述】:

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

#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;
}

但是,我遇到了一些错误,例如boost::optional&lt;unsigned&gt; 中没有名为 element_type 的类型。然而,reference page 页面说,唯一的前提条件是存在 operator*() 一元函数。有没有办法让它工作?

【问题讨论】:

    标签: c++ boost boost-optional


    【解决方案1】:

    这绝对是 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 上发布错误报告。

    【讨论】:

    • include header 使用 更好。
    • @Akira:好点;我忘了它在那里,因为它不像大多数其他 Boost 库的前向声明头文件那样不在根 boost 目录中。
    • 重新发现在被告知时没人愿意报告的错误非常棒。我独立发现并复制了这个,产生了这个trac ticket
    • @Lars:确实很棒。我只是做了同样的事情。但是,正如我在刚刚发布的答案中引用的那样,这可能是设计使然:stackoverflow.com/questions/7254131/…
    【解决方案2】:

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

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

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

    【讨论】:

    • detail 命名空间中使用类/函数应该始终是最后的手段;它们放在那里是因为它们不是专门用于给定库的实现之外的。
    猜你喜欢
    • 2021-06-06
    • 2020-12-23
    • 2017-12-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多