EOSIO C++合约编译报错:分解为2个元素但仅提供1个名称
错误原因
该错误触发于EOSIO CDT编译器的ABI生成环节,不属于标准C语法错误。
当使用C17结构化绑定语法接收多返回值时,EOSIO自带的ABI生成工具无法为隐式auto推导类型的解构变量自动生成符合校验规则的ABI字段映射,就会抛出「Decomposes into 2 elements but only 1 names were provided」报错。
触发错误的具体代码行:
const auto [ reserve_in, reserve_out ] = defibox::get_reserves( stoi(pair_id), tokens.symbol );
修复方案
两种修改方式均可解决问题,按需选择即可:
- 方案1:显式指定结构化绑定的返回值类型,跳过ABI生成器的自动推导逻辑
const std::pair<asset, asset> [ reserve_in, reserve_out ] = defibox::get_reserves( stoi(pair_id), tokens.symbol );
提示:该写法需要当前作用域已引入
<utility>头文件,EOSIO合约默认引入的依赖已经包含该头文件,无需额外手动添加。
- 方案2:放弃结构化绑定写法,先接收整体返回对象再取内部成员,兼容性最好,适配所有版本的EOSIO CDT
const auto reserves = defibox::get_reserves( stoi(pair_id), tokens.symbol ); const asset reserve_in = reserves.first; const asset reserve_out = reserves.second;
修改完成后重新执行编译命令即可通过校验。
内容的提问来源于stack exchange,提问作者Ebnb
相关产品推荐
相关产品推荐

