boost::container::vector 无法使用 C++03 编译器进行编译

2024-03-11

以下示例在使用带有 --std=c++0x 标志的 GCC 4.4.6 时可以正常编译,但在 C++03 模式下无法编译。

#include <stdint.h>
#include <boost/container/vector.hpp>

struct data
{
   int               i_;
   boost::container::vector<data>      v_;
};

int main( int argc, char** argv )
{
    data myData;
    myData.i_ = 10;

    data myData2;
    myData2.i_ = 30;

    myData.v_.push_back( myData2 );

    return 0;
}

它编译成功

 g++ --std=c++0x test-cont.cpp

但是如果我删除--std=c++0x我收到以下错误: g++ 测试-cont.cpp 在文件中包含来自 包括/c++/4.4.6/内存:49, 升压/容器/container_fwd.hpp:36, 升压/容器/向量.hpp:20, 来自 test-cont.cpp:2:

include/c++/4.4.6/bits/stl_algobase.h: In static member function 
    static _OI std::__copy_move<false, false, std::random_access_iterator_tag>::
        __copy_m(_II, _II, _OI) [with _II = 
            boost::container::constant_iterator<data, long int>, _OI = data*]:

include/c++/4.4.6/bits/stl_algobase.h:397:   instantiated from 
    _OI std::__copy_move_a(_II, _II, _OI) 
        [with bool _IsMove = false, 
                   _II = boost::container::constant_iterator<data, long int>, _OI = data*]

include/c++/4.4.6/bits/stl_algobase.h:436:   instantiated from 
    _OI std::__copy_move_a2(_II, _II, _OI) 
    [with bool _IsMove = false, 
               _II = boost::container::constant_iterator<data, long int>, _OI = data*]

include/c++/4.4.6/bits/stl_algobase.h:468:   instantiated from 
    _OI std::copy(_II, _II, _OI) 
        [with _II = boost::container::constant_iterator<data, long int>, _OI = data*]

boost/move/move.hpp:1147:   instantiated from 
    boost::copy_or_move(I, I, F, 
        typename boost::move_detail::disable_if< boost::move_detail::is_move_iterator<I>, void>::type*) 
        [with I = boost::container::constant_iterator<data, long int>, F = data*]

boost/container/detail/advanced_insert_int.hpp:58:   instantiated from 
    void boost::container::container_detail::advanced_insert_aux_proxy<A, FwdIt, Iterator>::copy_remaining_to(Iterator) 
    [with A = std::allocator<data>, FwdIt = boost::container::constant_iterator<data, long int>, Iterator = data*]

test-cont.cpp:21:   instantiated from here

include/c++/4.4.6/bits/stl_algobase.h:343: error: 
    no match for operator= in * __result = 
        __first.boost::container::constant_iterator<T, Difference>::operator* 
        [with T = data, Difference = long int]()

test-cont.cpp:5: note: candidates are: data& data::operator=(data&)

看起来 boost::container::vector 需要move我假设会自动使用的语义boost::move当使用 c++03 编译器编译时。

如果我手动修改struct data界定:

  1. 默认构造函数
  2. 复制构造函数
  3. 赋值运算符
  4. 使用 BOOST_RV_REF 的模拟移动构造函数
  5. 使用 BOOST_RV_REF 的模拟移动赋值运算符

该示例可以编译。

必须为 C++03 手动添加这些移动/复制构造函数和赋值运算符非常费力。

这是一个错误吗boost::container?如果是这样,向 boost 社区报告的最佳方式是什么?


这是 C++03 中模拟的限制(从这里 http://www.boost.org/doc/libs/1_51_0/doc/html/move/emulation_limitations.html#move.emulation_limitations.assignment_operator):

宏BOOST_COPYABLE_AND_MOVABLE需要定义一个副本 copyable_and_movable 的构造函数采用非常量参数 C++03编译器:

//Generated by BOOST_COPYABLE_AND_MOVABLE
copyable_and_movable &operator=(copyable_and_movable&){/**/}

由于生成了复制构造函数的非常量重载, 编译器为包含以下内容的类生成的赋值运算符 copyable_and_movable 将获得非常量复制构造函数重载, 这肯定会让用户感到惊讶。此限制强制用户定义副本的 const 版本 作业,在所有持有可复制和可移动类的类中 在某些情况下可能会很烦人.

在你的情况下boost::container::vector<data> v_; uses BOOST_COPYABLE_AND_MOVABLE(vector)因此出现错误。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

boost::container::vector 无法使用 C++03 编译器进行编译 的相关文章

随机推荐

  • 更改 Android 中的 MAC 地址

    我正在尝试更改已 root 的 Note 2 Android 设备的 Mac 地址 我做了以下事情 busybox ifconfig wlan0 关闭 busybox ifconfig wlan0 硬件以太 00 11 22 33 44 5
  • Rails 4 simple_form owns_to 关联未定义方法错误

    使用 Rails 4 当我想从对象 Document Document 渲染表单 使用 simple form 时 出现以下错误 undefined method document type id for
  • 搜索结果 url 中的 django csrf_token

    搜索结果 url 中有 csrf 不知道为什么会存在以及如何删除它 搜索效果很好 这是网址 search csrfmiddlewaretoken 675d1340034e094866d15a921407e3fc q testing 这是视图
  • 可靠的全双工串行通信

    我正在设计一种设备 它将加密从 PC 发送的长 假设无限 数据流并将其发回 我计划在运行全双工的设备上使用单个串行端口 并通过硬件握手来 阻止 数据 在每个块后发送一个 CRC 值 该设备只会缓冲有限数量的块 理想情况下 只有一个缓冲区累积
  • 是否可以在 OSX 中检测 Power Nap / DarkWake 模式

    我有一个通过 launchd 启动的守护进程 即使在 DarkWake 期间 它也会运行 并且在 OS X 再次返回睡眠状态之前没有时间完成 我可以想到以下解决方案 但没有找到实现此目的的方法 不要让该守护进程在 DarkWake 期间运行
  • Ropemacs 使用教程

    有很多网站都有相关说明安装Ropemacs 但到目前为止我找不到任何有关如何操作的说明use安装完成后即可 我已经安装了它 或者至少看起来是这样 Emacs 在其顶部菜单栏中有 Rope 菜单 怎么办 到目前为止 我只能使用 显示文档 默认
  • Docker 中的非 root 用户

    我有一个基本的 Dockerfile FROM ubuntu xenial USER test ENTRYPOINT bin bash 对于这个 Dockerfile 我希望能够创建一个没有密码的用户 并且当 Docker 容器运行时 我希
  • 通过 websocket 使用 javascript 传输文件

    你好 我正在尝试传输文件 我有一些程序将文件转换为二进制并使用 C 通过网络传输它们 我想知道我是否能够使用 javascript 和 websocket 传输文件 任何有关如何将我的 C 程序集成到 JavaScript 中的示例将不胜感
  • 无法在 Sublime Text 中的 REPL R 中运行选定的行

    按照这些说明为 sublime text 设置 REPLhttp www kevjohnson org using r in sublime text 3 http www kevjohnson org using r in sublime
  • 什么是擦除

    什么是擦除以及擦除对仿制药的限制是什么 Erasure http download oracle com javase tutorial java generics erasure html是在编译时使用类型但在运行时不存在的结果 这是 J
  • 反序列化后如何处理SerializationException

    我在 Spring Kafka 设置中使用 Avro 和 Schema 注册表 我想以某种方式处理SerializationException 在反序列化期间可能会抛出该异常 我找到了以下两个资源 https github com spri
  • 自动布局或使用 NSAttributedString 计算高度来实现 UITableViewCell 的动态高度的最佳方法是什么?

    我已经按照教程进行了http raywenderlich com 73602 dynamic table view cell height auto layout http raywenderlich com 73602 dynamic t
  • Delphi拖拽能否“提升”为对接?

    我有一个TPageControl其页面都是使用附加的各种形式ManualDock 用户应该能够通过拖动选项卡来重新排列选项卡 这已经可以使用了 然而 也应该可以取消停靠的表单 现在我有以下代码 procedure TMainForm Pag
  • Git 提交后挂钩:如何在 Windows 中启动 bat 文件

    我有一个带有名称的bat文件jenkins bat开始在詹金斯服务器上构建进程 现在我想在 git 中将这个 bat 文件作为 post commit hook 执行 因此创建了以下文件post commit在文件夹中 git hooks
  • cd:参数太多 - 空格正确转义+引号?

    使用 cygwin 终端 我的 bashrc 中有以下内容 export WINHOME cygdrive c Users userName export TUTORING WINHOME Desktop Coding Projects T
  • 如何计算OpenCV中Mat的最大像素值[重复]

    这个问题在这里已经有答案了 我想 这应该是显而易见的 但我找不到简单的方法来找到 OpenCV Mat 中所有像素中的最大值 当然 我可以对每种像素类型执行以下操作 但一般的 max 函数仍然有用 double cvMax cv Mat m
  • Woocommerce:支付网关自定义感谢页面

    我正在创建一个 Woocommerce 自定义支付网关插件 它基本上将用户重定向到支付服务页面 然后支付服务页面将用户重定向回指定的 URL 一切都按预期工作 但我似乎无法创建自定义感谢页面从插件 我所说的 来自插件 的意思是 如果有人安装
  • 使Python程序可执行

    from distutils core import setup import py2exe sys os sys argv append py2exe setup options py2exe bundle files 1 windows
  • 使用ansible复制本地文件(如果存在)

    我正在一个项目中工作 我们使用 ansible 来创建部署服务器集群 我必须实现的任务之一是将本地文件复制到远程主机 前提是该文件本地存在 现在我正在尝试用这个来解决这个问题 hosts 127 0 0 1 connection local
  • boost::container::vector 无法使用 C++03 编译器进行编译

    以下示例在使用带有 std c 0x 标志的 GCC 4 4 6 时可以正常编译 但在 C 03 模式下无法编译 include