为何将vector<long int>存入vector<vector<long int>>无编译运行错误?
为啥把
vector<long int>存成vector<vector<long int>>还能正常编译? 哈哈,这种“看起来明显不对劲但居然跑起来了”的祖传代码真的让人头大!我来帮你拆解几个最可能的原因:
结构体
potentialPars的成员类型和你想的不一样
先去查potentialPars的定义!大概率是你以为要存的是一维vector<long int>,但结构体里对应的成员其实就是vector<vector<long int>>——前辈可能一开始就设计成存二维结构,只是你误解了需求。代码是把一维vector作为元素插入到二维vector里
你贴的代码片段没写完,说不定后面的逻辑是这样的:vector<long int> tempVec; // 这里用gsl生成数据填充tempVec par.some2DVector.push_back(tempVec);这种操作完全合法!把一维vector当成二维vector的一个元素存进去,编译运行自然没问题,只是你误以为是“把一维直接转成二维存”。
类型别名搞混了(但编译器没报错)
如果代码里用了typedef或者using给vector起别名,比如:using IntVec = vector<long int>; using IntVec2D = vector<IntVec>;前辈可能不小心把变量的类型写错了,但刚好赋值逻辑是对的——比如本来要定义
IntVec的变量,写成了IntVec2D,但实际是用push_back加元素,这种情况编译器也不会报错。有没有自定义的重载?
极端一点的情况:前辈可能给vector<vector<long int>>写了自定义的赋值运算符,或者封装了一个继承自标准vector的类,支持从vector<long int>隐式转换。不过这种情况比较少见,优先查前面的原因。
快速排查建议
- 直接跳转到
potentialPars的定义,看目标成员的真实类型; - 补全你没贴完的代码,看存储操作到底是直接赋值还是插入元素;
- 搜索代码里的类型别名,确认有没有混淆一维/二维vector的定义。
内容的提问来源于stack exchange,提问作者Allure
相关产品推荐
相关产品推荐

