c++:error:locale::facet::_S_create_c_locale name not valid

在Linux ARM平台上遇到locale::facet::_S_create_c_localenamenotvalid错误,原因是代码中std::locale使用空字符串构造。通过查阅资料发现std::locale有默认构造函数,修改代码为不传参数的默认构造,问题得到解决。此解决方案适用于多种平台且不影响其他平台的正常运行。
摘要由CSDN通过智能技术生成

最近在做一个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)也没有问题.

我已经忘记当初为啥要填个空字符串做参数了.

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

10km

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值