前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >c++:error:locale::facet::_S_create_c_locale name not valid

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

作者头像
10km
发布2021-03-25 16:31:24
1.9K0
发布2021-03-25 16:31:24
举报
文章被收录于专栏:10km的专栏10km的专栏

最近在做一个linux-arm平台的项目时,遇到如如下错误

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

按照网上的找到所有答案都是要为主机添加语言支持,可是对于我们来说,程序是在客户的设备上跑的,要求用户添加特定的设置并不现实。

通过反复查找,定位到下面的代码,是一个将字符串转大写的模板函数:

代码语言:javascript
复制
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是有默认构造函数的。于是将上面的代码改为

代码语言:javascript
复制
static const std::locale loc;

问题解决,修改后的代码其他平台(windows-x86-64,linux-x86-64,android-arm)也没有问题.

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2021-03-24 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档