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

类中调用std::vector push_back初始化列表报错的解决求助

问题分析

编译错误的核心是:编译器无法将{buf, nb}这个初始化列表匹配到std::vector<std::vector<unsigned char>>::push_back的参数类型。

你的bins是cl::Program::Binaries,底层类型为std::vector<std::vector<unsigned char>>,因此push_back需要接受一个std::vector<unsigned char>对象。但你写的{buf, nb}会被编译器误解为构造一个包含两个元素的std::vector<unsigned char>(将buf强制转换为unsigned char、nb转换为unsigned char),而非你预期的从buf指向的内存中复制nb个字节的有效vector。

至于main函数中代码能通过编译,大概率是编译器的宽松推导导致的,但实际上这是错误写法——你并没有正确将xclbin文件内容存入vector,只是构造了一个仅含两个无效元素的vector,后续运行可能触发未定义行为。

解决方案

你需要显式构造std::vector<unsigned char>来承载xclbin数据,以下是两种高效写法:

方法1:使用emplace_back直接构造(推荐)

emplace_back可直接在bins容器内部构造std::vector<unsigned char>,避免临时对象开销,同时明确指定迭代器范围:

int push_xclbinFile_to_FPGA(){
  // 转换buf指针类型为unsigned char*,确保与vector元素类型匹配
  auto buf_unsigned = reinterpret_cast<unsigned char*>(buf);
  bins.emplace_back(buf_unsigned, buf_unsigned + nb);
  devices.resize(1);
  program = cl::Program(context, devices, bins);
  return 1;
}

方法2:显式构造vector后push_back

若你更习惯显式构造的写法,可先创建vector再加入容器:

int push_xclbinFile_to_FPGA(){
  auto buf_unsigned = reinterpret_cast<unsigned char*>(buf);
  std::vector<unsigned char> bin_data(buf_unsigned, buf_unsigned + nb);
  bins.push_back(bin_data);
  devices.resize(1);
  program = cl::Program(context, devices, bins);
  return 1;
}
额外建议

同时请修正main函数中的对应代码,避免后续运行出现问题——将i_obj.bins.push_back({i_obj.buf,i_obj.nb});替换为上述两种写法之一。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 12:33:19