递归变量容器编译器错误

时间:2014-02-18 10:16:20

标签: c++ c++11 variant

我想要一个变体包含其类型对象的副本。不知怎的,它不起作用:

struct value
{
};

class json;

using json = ::boost::variant<
  ::std::vector<::std::unique_ptr<json> >,
  ::std::unordered_map<::std::string, ::std::unique_ptr<json> >,
  value
>;

json.hpp:116:2: error: conflicting declaration 'using json = '
 >;
  ^
json.hpp:110:7: error: 'class json' has a previous declaration as 'class json'
 class json;

我已经知道有2个变通办法:::std::unique_ptr<void>,有自定义删除工具,以及使用::boost::any代替变体的可能性,但这些是唯一的方法吗? ::boost::any的问题是我需要启用RTTI才能使其正常工作。

1 个答案:

答案 0 :(得分:1)

怎么样:

struct json : ::boost::variant<
  ::std::vector<::std::unique_ptr<json> >,
  ::std::unordered_map<::std::string, ::std::unique_ptr<json> >,
  value
>
{
  using variant::variant;

  template <typename U>
  json& operator=(U&& u)
  {
    variant::operator=(::std::forward<U>(u));

    return *this;
  }
};

这将是解决方案,除非它对g ++不起作用(由于构造函数调用模糊,构造出矢量的json失败)。从 const引用到这样的向量的构造起作用,但不是非const引用。我不知道为什么。此外,unique_ptr对我不起作用boost::variant,因为它不可复制(shared_ptr确实有效)。