我有以下问题:我有一个从stringstring的映射,称为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/

10-11 22:52