最近在做一个linux-arm平台的项目时,遇到如如下错误
error:locale::facet::_S_create_c_locale name not valid
按照网上的找到所有答案都是要为主机添加语言支持,可是对于我们来说,程序是在客户的设备上跑的,要求用户添加特定的设置并不现实。
通过反复查找,定位到下面的代码,是一个将字符串转大写的模板函数:
template<typename E,
typename TR = std::char_traits<E>,
typename AL = std::allocator<E>>
inline std::basic_string<E, TR, AL> toupper(const std::basic_string<E, TR, AL>&src) {
auto dst = src;
static const std::locale loc("");
transform(src.begin(), src.end(), dst.begin(), [&](E c)->E {return std::toupper(c, loc); });
return dst;
}
这个代码我在windows-x86-64,linux-x86-64,android-arm平台能正常运行,唯独在linux-arm上跑出上面的问题。
如这个代码std::locale loc("")
std::locale对象是传了一个空字符串来构造的.既然提示name not valid
(名字无效),应该就是指输入的空字符串做参数不对喽。
又查了一下std::locale
是有默认构造函数的。于是将上面的代码改为
static const std::locale loc;
问题解决,修改后的代码其他平台(windows-x86-64,linux-x86-64,android-arm)也没有问题.
我已经忘记当初为啥要填个空字符串做参数了.