我有以下问题:我有一个从string
到string
的映射,称为psMap
。即psMap["a"]="20", psMap["b"]="test", psMap["c"]="12.5", psMap["d"]="1" (true)
,因此该映射存储各种基本数据类型的字符串表达式。
以下函数foo
应该(给定一个键)将映射的值复制到相应的类型变量,即;
int aa;
foo("a", aa);
=> aa=20.
明确地说,我想为所有可能的数据类型提供一个功能(因此,无需手动转换),所以我尝试使用利用
istringsteram
自动转换的模板,即template<class PARAMTYPE>
void foo(string _name, PARAMTYPE& _dataType) {
PARAMTYPE buff;
istringstream(psMap[_name]) >> buff;
_dataType = buff;
}
问题是,“ >>”操作给出了错误:
Error: no match for »operator>>« in »std::basic_stringstream<char>((* ....
这是怎么了?
stringstream
是否不能识别正确的数据类型,并尝试通过管道传递给抽象类型的“模板”?如何使我的代码正常工作?为您的努力加油吧:)
最佳答案
您已经创建了一个临时std::istream
,这意味着它
无法绑定到非常量引用。一些>>
是
成员函数,它们将起作用,但其他函数是免费的
具有签名的功能:
std::istream& operator>>( std::istream&, TargetType& );
并且这些将不起作用(甚至无法编译)。
为避免该问题,只需声明一个
std::istringstream
并使用它,或者在临时
什么都不做,但是返回一个(非常量)引用:
std::istringstream( psMap[name] ).ignore(0) >> buff;
(就个人而言,我发现单独的变量更易读。)
关于c++ - 从Istringstream管道到模板,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21481416/