You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Solidity添加payable后Truffle编译出现Expected primary expression报错如何解决

问题原因

你当前使用的Solidity ^0.5.16版本不支持payable(普通地址)的强制转换语法,该语法是Solidity 0.6.0及以上版本才新增的特性,因此你添加该写法后会触发新的编译错误。

解决方案

以下两种方案二选一即可:

方案1:使用0.5.x版本支持的地址转换写法

将distributePrizes函数中转账的代码行:

payable(winners[j]).transfer( (betwa*(10000+(LoserBet*10000/WinnerBet)))/10000 );

修改为:

address(uint160(winners[j])).transfer( (betwa*(10000+(LoserBet*10000/WinnerBet)))/10000 );

原理是0.5.x版本中,可以先将普通address类型转为uint160整数,再转回address类型,得到的就是payable属性的地址,可直接调用transfer/send方法。

方案2:直接将地址变量定义为payable类型

从根源上避免类型转换问题,修改以下几处变量定义即可:

  1. 将存储玩家地址的数组定义改为:
address payable[] public players;
  1. 将distributePrizes函数中的winner数组定义改为:
address payable[1000] memory winners;
  1. 将distributePrizes函数中的playerAddress变量定义改为:
address payable playerAddress;

修改后原来的转账代码不需要加payable转换,可直接运行。

额外代码问题提示

你现有代码中delete playerInfo[playerAddress];逻辑存在问题,只会删除最后一次遍历到的玩家数据,其余玩家的历史投注信息不会被清除,建议改为循环遍历所有玩家删除对应信息,或者保留mapping数据不影响下一轮投注的正常运行。


内容的提问来源于stack exchange,提问作者Mohammad Fahad

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 12:27:05