c++ - 如何正确使用结构的共享指针成员?
问题描述
我有一个包含 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; }
我收到以下错误:
function "std::pair<_Ty1, _Ty2>::pair(const std::pair<_Ty1, _Ty2> &) [with _Ty1=const std::string, _Ty2=newtickerDiary ]”(在“C:\Program Files (x86)\Microsoft Visual Studio\2019\Community\VC\Tools\MSVC\14.21.27702\include\utility”的第 133 行声明)不能被引用——它是被删除的功能
以下是相关的数据容器/类型:
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;
我需要帮助来弄清楚如何解决这些错误。
解决方案
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]
推荐阅读
- javascript - 如何使用 vanilla Javascript 保存和恢复浏览器选择?
- rust - 使用 tonic::Status 和 redis::RedisError 对 Redis 和 Tonic 异步应用程序进行正确的错误处理
- android - 在“打开方式”对话框中将我的 React Native 应用程序添加为电话应用程序
- ios - 如何通过 API 下载 iOS 产品类型标识符
- wpml - WPML 高级翻译编辑器杀死 DIVI 中的代码模块
- reactjs - Create React App PWA service worker 中缓存大小限制的解决方法
- apache-spark - 创建 Google Dataproc 集群并连接到外部远程 Hive 元存储
- android - 切换按钮适用于 iPhone,但不适用于 Android
- python - 如何在 Python 中从列表中提取值
- asp.net-mvc - 如何集中处理不同应用程序上的长时间运行的作业?