类中调用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

