如何正确使用结构的共享指针成员?

时间:2019-10-12 12:55:00

标签: c++ c++11

我有一个包含一个vector的shared_ptr的结构。在我的代码中,我遇到了3个与此相关的错误:

  •   

    在这一行, newtickerDiary t; t.dataPtr->reserve(MAX_OHLC_ENTRIES); tDiaries[token] = t;
    我收到此错误:
    函数“ newtickerDiary :: operator =(const newtickerDiary&)”(已声明   隐式)不能被引用-这是一个已删除的函数

  •   

    在这一行,
    QuotationWTime &prevQ = tDiaries[token].dataPtr[size -> 1];
    我收到以下错误:
      没有运算符“ []”与这些操作数匹配

  •   

    在这一行,
    for (auto x : tDiaries) { x.second.updatesOn = false; }
    我收到以下错误:
    函数“ std :: pair <_Ty1,_Ty2> :: pair(const std :: pair <_Ty1,_Ty2>&)[with _Ty1 = const std :: string,_Ty2 = newtickerDiary]“(在“ C:\ Program Files(x86)\ Microsoft Visual的第133行声明   Studio \ 2019 \ Community \ VC \ Tools \ MSVC \ 14.21.27702 \ include \ utility“)   无法引用-这是一个已删除的功能

以下是相关的数据容器/类型:

typedef int16_t int16;
typedef int32_t int32;

struct QuotationWTime {
    union AmiDate DateTime; // 8 byte
    float   Price;
    float   Open;
    float   High;
    float   Low;
    float   Volume;
    float   OpenInterest;
    float   AuxData1;
    float   AuxData2;
};

struct newtickerDiary {
    string name = ""; //AmiBroker scrip name
    string ohlcPeriodicity = "minute"; //interval of fetched OHLC data
    bool ohlcStatus = false; //updated initially. Will be set to 0 upon plugin initialization
    bool rtStatus = false;//updated initially. Will be set to 0 upon plugin initialization
    bool updatesOn = true;
    int32 ohlcDayBarIndex = 0; //last updated bar
    shared_ptr<vector<QuotationWTime>> dataPtr = std::make_shared<std::vector<QuotationWTime>>();
    mutex dataMutex;
};

unordered_map<string, newtickerDiary> tDiaries;

我需要帮助找出如何解决这些错误。

1 个答案:

答案 0 :(得分:1)

std::mutex不可复制,也不可移动。而且由于newtickerDiary的成员类型为std::mutex,所以它也不是可复制或不可移动的(至少不是隐式的;您可以提供显式的复制/移动构造函数和赋值运算符)。

这就是tDiaries[token] = t;无法编译的原因-它试图复制newtickerDiary的实例。与std::shared_ptr无关。


类似地,for (auto x : tDiaries)尝试复制tDiaries的元素,但由于不可复制而失败。您可能无论如何都不想在这里复制(否则分配给x.second.updatesOn会毫无意义)。做吧

for (auto& x : tDiaries)

注意与号。


tDiaries[token].dataPtr[size - 1]失败是因为tDiaries[token].dataPtr不是数组或容器-它是指向数组的指针。做吧

(*tDiaries[token].dataPtr)[size - 1]