带升压变体的隔离错误
Segfault with boost variant
我已经开始建立一点数据类型,在当前阶段,我在boost变体中只有一个递归类型。事实证明,当我尝试实例化我的类型时,我遇到了段错误。如果我在递归类型之前放一个字符串,它就可以工作,把它放在它不起作用的类型之后。我正在使用 gcc 4.8.1 64 位和 boost 1.54 的 mingw。
我使用提升变体的方式是否错误?
#include <boost/variant.hpp>
#include <boost/variant/recursive_variant.hpp>
#include <string>
#include <iostream>
struct A;
struct B;
using C = boost::variant<boost::recursive_wrapper<A>>;
// works:
// using C = boost::variant<std::string, boost::recursive_wrapper<A>>;
struct A {
std::string name;
C variant;
};
struct B {
std::string name;
C variant;
};
int main() {
std::cout << "start" << std::endl;
B hAST; // <--- segfaults
std::cout << "end" << std::endl;
return 0;
}
我相信
这是由于variant
的"永不空"保证:C
的默认构造函数必须使用其第一个模板参数的默认构造值(recursive_wrapper<A>
)初始化自身,并且recursive_wrapper<A>
的默认构造函数必须使用默认构造的A
实例初始化自身,这会导致无限递归。
假设您实际上想要一个空的variant
或A
的实例,您可以引入虚拟类型作为变体的第一个参数,例如:
struct variant_is_empty { };
using C = boost::variant<variant_is_empty, boost::recursive_wrapper<A>>;
编辑:看起来您可以将boost::recursive_wrapper
与boost::optional
一起使用,这比在上述可选递归类型的情况下使用variant
更容易。
相关文章:
- 从矢量中删除元素后出现隔离错误
- 在 gtest 中初始化堆栈上的引用变量的隔离错误
- 线程时访问静态映射时出现隔离错误
- 并行快速排序分区中的隔离错误
- C++多线程程序:变量定义为类成员的隔离错误
- TFLite 隔离错误,通过获取C++输入和输出
- 我只是在寻找模板,在我的书中找到了这段代码,这显示了隔离错误?
- pthread_create中错误 4 的隔离错误
- 递归树遍历/分支删除的隔离错误
- 在类模板上使用 arm gcc 编译期间的隔离错误
- 从大量文件读取时出现隔离错误
- 在PHP扩展中使用emalloc从线程时出现隔离错误
- 通过 Boost Python 在C++对象之间传递共享指针的隔离错误
- 在QT中单击菜单时出现隔离错误
- 尝试访问标头声明成员时出现隔离错误
- 搜索链表时出现隔离错误
- 模板化子类析构函数中的隔离错误
- 插件中节点.js/Nan 回调C++不频繁的隔离错误
- 将行添加到 GTKTreeView 时的隔离错误
- 找不到命令时打开的隔离错误