0

所以前段时间我在玩 Boost.Extension 例子。他们用

  std::map<std::string, factory<computer> > computers;
  computers.swap(types.get());

但是当我开始将项目从 bjam 移植到 premake 到 Visual Studio Project 2008时,我发现我不能使用他们用于创建地图的方法。我总是在那一行得到编译器错误 C2512(实际上在Boost.Extension type_map.hpp 内的第 74 行)。所以我使用了创建地图链接的方法

map<string, factory<computer> >& computers(types.get());

(他们在一些教程中使用过)并且全部编译。我对 C++ 很陌生,可能不太了解。

那么在这种情况下和一般情况下,从链接创建地图与简单创建地图有什么区别?

更新 - 完整的错误消息

错误 1 ​​错误 C2512: boost::extensions::basic_type_map::type_map_convertible::type_holder: 没有合适的默认构造函数可用 c:\users\avesta\downloads\extension-svn-source\boost\extension\type_map.hpp 74 Mltiple-Inheritance

4

1 回答 1

3

不同之处在于第二种情况根本不创建地图。它创建对已经存在的地图的引用。types包含一个映射,并types.get()返回对该映射的引用,您可以使用它来初始化您自己的引用。如果您使用该参考修改地图,那么您正在修改包含在types.

第一种情况确实创建了一个空地图;然后它将它与 中包含的(可能是非空的)映射交换,types之后types留空。这将需要所涉及的各个类别的更多支持;有些可能需要默认可构造、可交换,并且可能需要可复制和/或可分配。错误代码似乎表明其中一个类需要公共默认构造函数,但没有;如果您包含整个错误消息,它可能有助于诊断问题。

于 2011-04-26T11:25:21.157 回答