接受对抽象类的const引用的C ++构造函数无法初始化std :: map

时间:2019-04-24 02:25:02

标签: c++

我有一个抽象类A,它为在类B中的实现定义了一个接口。A的所有方法都是纯虚拟的。

我的问题是带有签名B(const A&base)的B的构造函数。我被卡住了...我想不起来要正确复制std :: map的内容。请参阅下面的更多细节。任何帮助将不胜感激!

struct W {
    W() = default;
};

template<typename T>
struct V : public W {
    V() = default;
};

class A {
public:
    A() = default;
    virtual std::map<std::shared_ptr<const W>, std::any> getFields() const = 0;
};

template<typename T>
class B : public A {
private:
    std::map<std::shared_ptr<const V<T>>, std::any> _fields;
    T _value;

public:

    B(T value) : _value(value) {
    }

    explicit B(const A &base) {
        for (std::pair<std::shared_ptr<const W>, std::any> field : base.getFields()) {
            auto key = std::dynamic_pointer_cast<const V<T>>(field.first);
            // the line below does not compile...
            _fields.insert(key, field.second);
        }  
    }

    std::map<std::shared_ptr<const W>, std::any> getFields() const override {
        std::map<std::shared_ptr<const W>, std::any> copy;
        copy.insert(_fields.begin(), _fields.end());
        return copy;
    }
};

struct C {
  std::vector<std::shared_ptr<const B<int>>> vec;

  void addElement(const A& element) {
      vec.push_back(std::make_shared<const B<int>>(element));
  }  
};

1 个答案:

答案 0 :(得分:1)

std::map::insert()采用一个键值对,而不是单独的键和值:

_fields.insert(std::make_pair(key, field.second));

或者,考虑使用std::map::emplace(),它会在地图内部构造键/值对:

_fields.emplace(std::move(key), std::move(field.second));