首页 > 解决方案 > 如何正确使用结构的共享指针成员?

问题描述

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

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

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;

我需要帮助来弄清楚如何解决这些错误。

标签: c++c++11

解决方案


std::mutex不可复制,不可移动。并且因为newtickerDiary有 type 的成员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]

推荐阅读