簡體   English   中英

接受對抽象類的const引用的C ++構造函數無法初始化std :: map

[英]C++ Constructor that accepts const reference to abstract class can't initialize std::map

我有一個抽象類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));
  }  
};

std :: map :: insert()采用鍵值對,而不是單獨的鍵和值:

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

另外,考慮一下std :: map :: emplace() ,它可以在地圖內部構造鍵-值對:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM