C++98下初始化UNITCallback类指针vector触发类型转换报错如何解决
问题根因
该编译报错由C++98标准下std::vector的构造函数匹配规则导致,具体原因如下:
- 你在
UNITEvent_LoopImpl构造函数的初始化列表中写的callBacks(1024,0),预期调用vector的「指定元素个数+初始默认值」构造函数,对应原型为:vector(size_type count, const T& value, const Allocator& alloc = Allocator()) - 但你当前CMake配置指定使用C++98标准,std::vector存在一个模板化的「双迭代器」构造函数:
你传入的两个参数template<class InputIt> vector(InputIt first, InputIt last, const Allocator& alloc = Allocator())1024和0都是int类型,编译器推导时会优先匹配模板化的迭代器构造函数,而非你预期的填充构造函数。 - 迭代器构造函数内部逻辑会尝试将传入的第二个int类型的
0赋值给UNITCallback*类型的vector元素,C++98标准下该场景中int值无法隐式转换为指针类型,因此抛出invalid conversion from int to UNITCallback*的错误。
修复方案
根据你当前使用C++98的环境,可任选以下一种方案修改:
- 将第二个参数显式转换为对应指针类型,强制匹配填充构造函数:
callBacks(1024, static_cast<UNITCallback*>(0)) - 将第一个参数显式转换为
size_t类型,避免匹配迭代器模板:callBacks(static_cast<size_t>(1024), 0) - 若后续可以升级C标准到C11及以上,直接使用
nullptr代替0初始化即可:callBacks(1024, nullptr)
内容的提问来源于stack exchange,提问作者Apollo17
相关产品推荐
相关产品推荐

