c++ - : Insert pair into multimap, 其中一种类型如何是抽象的?

标签 c++ stl dictionary polymorphism abstract-class

例如:

abstract class goal
class priority
class childgoal

multimap<priority, goal> mm;
mm.insert(make_pair(priority(), childgoal());

我收到错误:

cannot declare field 'std::pair<priority, goal>::second'
to be of abstract type 'goal'

如果我没记错的话,Pair 使用默认构造函数在分配之前创建第二个,这就是造成困扰的原因。我可能不正确,但它可以解释错误。

如何解决这个问题...当其中一种类型是抽象的时,如何完成插入多重映射(或可能是映射)?

最佳答案

您可以制作指针 map :

#include <memory>
#include <map>

class Base { };
class Derived1 : public Base { };
class Derived2 : public Base { };

typedef std::shared_ptr<Base> MyPtr;
typedef std::multimap<Key, MyPtr> MyMap;

int main()
{
  MyMap m { { Key(1), MyPtr(new Derived1) }, { Key(2), MyPtr(new Derived2) } };
}

统一初始化语法需要C++11支持。在旧版本中,您可以插入:

m.insert(MyMap::value_type(Key(1), MyPtr(new Derived1)));

如果没有其他人需要映射的对象,您可能会得到 std::unique_ptr<Base>反而。更改 typedef 很简单。

关于c++ - : Insert pair into multimap, 其中一种类型如何是抽象的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8013216/

相关文章:

c++ - C++中命名空间的一个例子

c++ - 将 std::list 附加到 std::list 的 vector 中

c++ - 同时对两个 vector (键/值)进行排序的最快方法?

c++ - 从 const 映射中读取的惯用 C++

c++ - std::vector(n, std::vector(n)) 还是 std::vector(n*n)?

javascript - Leaflet.js 球形墨卡托 WMS map 上的 GeoJSON 形状扭曲

dictionary - Elixir 按条件过滤映射条目

c++ - 我的 cin 在 while 循环中被忽略了

python - 提供列表中非常具体的元素的计数并返回它的函数

c++对二项式系数递归函数的误解