我有一个抽象类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));
}
};
答案 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));