vs2015 函数模板警告!

玉生香 2018-09-21 03:08:32
vs2015 定义函数模板,调用告警,为啥!!!



#define M2WCP_ACP 0X9000000
#define W2MCP_ACP 0X9100000

#define M2WCP_UTF8 0X9065001
#define W2MCP_UTF8 0X9165001


template <class In, class Out>
Out iconv( In inbuf, Out outbuf, const int &type)
{
int nLen = 0;
int byte_type = -1; /*字节类型 区别多字节 宽字节 'M' 表示多字节 'W'表示宽字节*/
int encode_type = -1; /*编码类型 CP_ACP CP_UTF8*/

switch (type)
{
case M2WCP_ACP:
encode_type = CP_ACP;
byte_type = int('M');
break;
case W2MCP_ACP:
encode_type = CP_ACP;
byte_type = int('W');
break;
case M2WCP_UTF8:
encode_type = CP_UTF8;
byte_type = int('M');
break;
case W2MCP_UTF8:
encode_type = CP_UTF8;
byte_type = int('W');
break;
default:
break;
}

if (byte_type == int('W'))
{
nLen = WideCharToMultiByte(encode_type, 0, (LPCWSTR)inbuf.c_str(), -1, NULL, 0, NULL, NULL);
if(nLen > 0)
{
outbuf.resize(nLen, ' ');
WideCharToMultiByte(encode_type, 0, (LPCWSTR)inbuf.c_str(), -1, (LPSTR)outbuf.c_str(), nLen, NULL, NULL);
}
}
else if (byte_type == int('M'))
{
nLen = MultiByteToWideChar(encode_type, NULL, (LPCSTR)inbuf.c_str(), inbuf.length(), NULL, 0);
if (nLen > 0)
{
outbuf.resize(nLen, ' ');
MultiByteToWideChar(encode_type, NULL, (LPCSTR)inbuf.c_str(), inbuf.length(), (LPWSTR)outbuf.c_str(), nLen);
}
}

if (nLen == 0) outbuf = Out();
return outbuf;
}


/*vs2015 这么调用,告警 告警如下图*/
wstring str;
string sstr((char*)(key));
str = iconv<string&, wstring&>(sstr, str, M2WCP_UTF8);









...全文
195 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
玉生香 2018-09-22
  • 打赏
  • 举报
回复
结贴!!!!!!!!

注意点错误,只是数据转换引起的!
玉生香 2018-09-22
  • 打赏
  • 举报
回复
引用 3 楼 jianwen0529 的回复:
string length返回的类型是size_t 无符号整形数,在int不足以表示的size_t有效范围的情况会报这类警告。
使用强制转换(int)即可消除


是的!!!我以为是模板定义错,一门心思注意到模板定义上,哎!
玉生香 2018-09-22
  • 打赏
  • 举报
回复
引用 1 楼 adlay 的回复:
str = iconv<string&, wstring&>(sstr, str, M2WCP_UTF8); => str = iconv<string, wstring>(sstr, str, M2WCP_UTF8);

警告嘛, 在这些调用 length 的地方加上强制转换把: inbuf.length() => (int)inbuf.length() 原因提示里面说的很清楚了.


一直以为是模板定义有问题,竟然没看到是因为这些转换引起的
kbasm 2018-09-21
  • 打赏
  • 举报
回复
(int)M2WCP_UTF8
幻夢之葉 2018-09-21
  • 打赏
  • 举报
回复
string length返回的类型是size_t 无符号整形数,在int不足以表示的size_t有效范围的情况会报这类警告。
使用强制转换(int)即可消除
ZhuJiaYou 2018-09-21
  • 打赏
  • 举报
回复
你说的是那个note吗?
你显示实例化函数模板,覆盖了函数模板实例化的实参推断机制。
www_adintr_com 2018-09-21
  • 打赏
  • 举报
回复
str = iconv<string&, wstring&>(sstr, str, M2WCP_UTF8); => str = iconv<string, wstring>(sstr, str, M2WCP_UTF8); 警告嘛, 在这些调用 length 的地方加上强制转换把: inbuf.length() => (int)inbuf.length() 原因提示里面说的很清楚了.

64,691

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧