MSVC2010下用std::getline分割std::wstring报错,求排查原因
解决MSVC2010中std::getline分割std::wstring的编译错误
你遇到的问题根源其实很直白——你传给getline的分隔符是窄字符',',但你的流和字符串都是宽字符类型(std::wistringstream、std::wstring),类型不匹配直接导致了模板推导失败。
先看你写的原始代码:
std::wstring sql; std::wistringstream str( sql ); std::wstring s; while( std::getline( str, s, ',' ) ) { }
在MSVC2010中,std::getline的模板参数要求完全统一:流的元素类型、字符串的元素类型,以及分隔符的类型必须保持一致。但你用的','是char类型,编译器无法确定模板参数到底该用char还是wchar_t,于是就抛出了那些模板歧义的编译错误。
修正后的代码
只需要把分隔符改成宽字符版本的L','就能解决问题:
std::wstring sql; std::wistringstream str( sql ); std::wstring s; while( std::getline( str, s, L',' ) ) { // 在这里处理分割后的每个子字符串s }
为什么这样能解决问题?
L','是wchar_t类型的字符,和std::wistringstream、std::wstring的元素类型完全匹配- 编译器现在可以明确推导
getline的模板参数为wchar_t,不会再出现参数歧义的错误
额外补充:在C++11及之后的标准里,部分编译器会支持隐式类型转换来兼容这种场景,但MSVC2010对模板参数推导的处理比较严格,所以必须显式使用宽字符分隔符。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

