Android NDK下C++使用std::max模板函数编译失败如何解决?
报错根因
std::max是模板函数,要求两个入参类型完全一致才能完成模板参数推导。在Android NDK的64位编译环境中,size_t的实际类型为unsigned long:
- 首次传入的字面量
1类型是int,和unsigned long类型不匹配,触发模板推导冲突 - 替换为
1u后类型为unsigned int,仍然和unsigned long类型不匹配,因此报错依旧。
最优解决方案
最优方案是显式指定std::max的模板参数类型,无需修改入参写法,兼容性和可读性最佳:
size_t block_size = 1024; size_t step_size = 512; size_t final_steps = std::max<size_t>(1, (block_size / step_size) - 1);
该写法直接告知编译器使用size_t类型实例化std::max模板,会自动将两个入参统一转换为size_t类型,不需要考虑不同平台size_t的实际类型差异(32位环境下size_t为unsigned int、64位为unsigned long),跨平台编译无需调整代码。
内容的提问来源于stack exchange,提问作者Mateusz Kaźmierczak
相关产品推荐
相关产品推荐

