前一段时间我正在玩Boost.Extension示例。 They used
std::map<std::string, factory<computer> > computers;
computers.swap(types.get());
但是当我开始移植项目from bjam to premake to visual studio project 2008时,我发现我无法使用他们用于创建地图的方法。我总是在那一行得到Compiler Error C2512(实际上在line 74 inside Boost.Extension type_map.hpp上)。所以I used way of creating a link to a map:
map<string, factory<computer> >& computers(types.get());
(他们在some of there tutorials中使用)并且全部编译完毕。我对C ++很陌生,可能不会得到很多。
那么从链接创建地图与简单创建地图之间的区别是什么,在这种情况下和一般情况下呢?
更新 - 完整的错误消息
错误1错误C2512: 提高::扩展:: basic_type_map :: type_map_convertible :: type_holder: 没有合适的默认构造函数 可用c:\ users \ avesta \ downloads \ extension -svn-source \ boost \ extension \ type_map.hpp 74 Mltiple-Inheritance
答案 0 :(得分:3)
不同之处在于第二种情况根本没有创建地图;它创建了对已存在的地图的引用。 types
包含一张地图,types.get()
会返回对该地图的引用,您可以使用该地图初始化自己的引用。如果使用该引用修改地图,则表示您正在修改types
中包含的地图。
第一种情况确实会创建一个空地图;然后将其与types
中包含的(可能是非空的)地图交换,之后将types
留空。这将需要来自各个班级的更多支持;有些可能需要默认可构造,可交换,并且可能是可复制和/或可分配的。错误代码似乎表明其中一个类需要一个公共默认构造函数,但没有一个;如果包含整个错误消息,则可能有助于诊断问题。