2

我已经开始构建一个小数据类型,在当前阶段,我在 boost 变体中只有一个递归类型。事实证明,当我尝试实例化我的类型时出现段错误。如果我在递归类型之前放置一个字符串,它可以工作,把它放在它不工作的类型之后。我正在使用 mingw 和 gcc 4.8.1 64bit 和 boost 1.54。

我是否以错误的方式使用了 boost 变体?

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

1 回答 1

3

我相信这是由于“永不空”的保证variant: 的默认构造函数C必须使用其第一个模板参数的默认构造值初始化自身 - 这是recursive_wrapper<A>- 并且默认构造函数recursive_wrapper<A>必须使用默认构造的的实例A,这导致无限递归。

假设您实际上想要 avariant是空的,或者是 的实例A,您可以引入一个虚拟类型作为变体的第一个参数,例如:

struct variant_is_empty { };

using C = boost::variant<variant_is_empty, boost::recursive_wrapper<A>>;

编辑:看来您可以使用boost::recursive_wrapperwith boost::optional这比使用variant上述可选递归类型的情况更容易。

于 2013-10-25T01:00:53.847 回答