Как правильно использовать разделяемый указатель члена структуры? - PullRequest
0 голосов
/ 12 октября 2019

У меня есть структура, содержащая 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]" (объявлена ​​в строке 133на «C: \ Program Files (x86) \ Microsoft Visual 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 Ответ

1 голос
/ 12 октября 2019

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]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...