Solidity 0.7+版本结构体含嵌套映射无法构造报错如何解决
错误原因
该报错是Solidity 0.7及以上版本的语法限制导致:mapping类型仅支持存储在链上storage空间中,无法在内存memory中构造。当结构体内部包含(嵌套)映射时,你无法先在内存中生成完整的结构体实例,再整体赋值给存储变量,内存空间不支持承载映射类型的结构。
解决方案
无需修改Product结构体的定义,只要调整addProductToStore方法的赋值逻辑即可:直接获取目标存储位置的结构体引用,逐一为非映射字段赋值,结构体内的bids映射会自动完成初始化,不需要手动操作。
修改后的addProductToStore代码如下:
function addProductToStore( string calldata _name, string calldata _category, string calldata _imgLink, string calldata _descLink, uint _auctionStartTime, uint _auctionEndTime, uint _startPrice, uint _productCondition ) public{ require(_auctionStartTime < _auctionEndTime); productIndex += 1; // 直接获取storage位置的结构体引用,此时结构体已分配存储空间,映射自动初始化 Product storage product = stores[msg.sender][productIndex]; // 逐一赋值非映射字段 product.id = productIndex; product.name = _name; product.category = _category; product.imgLink = _imgLink; product.descLink = _descLink; product.auctionStartTime = _auctionStartTime; product.auctionEndTime = _auctionEndTime; product.startPrice = _startPrice; product.highestBidder = address(0); product.highestBid = 0; product.secondHighestBid = 0; product.totalBids = 0; product.status = ProductStatus.Open; product.condition = ProductCondition(_productCondition); productIdInStore[productIndex] = msg.sender; }
注意事项
- 后续操作出价记录时,直接访问对应
Product实例的bids属性即可正常读写,和原有逻辑完全兼容 - 若结构体还有其他非映射类型的新增字段,按照上述格式逐一赋值即可
内容的提问来源于stack exchange,提问作者Lee Alex
相关产品推荐
相关产品推荐

