例如:
std::stringstream formatMemUsage(...) {
std::stringstream ss ...
...
return ss << "MB"; // Error here
}
导致错误no suitable user-defined conversion from "std::basic_ostream<char, std::char_traits<char>>" to "std::stringstream" exists
。
我可以将return语句分成2个语句ss << "MB"; return ss;
,错误消失了 - 为什么?
(使用MSVC ++ 2010)
答案 0 :(得分:8)
因为您要返回最后一个评估语句。考虑一下这实际上在做什么:
return ss << "MB";
相当于:
return operator<<(ss, "MB");
在这种情况下,operator<<
的返回类型是,如您所见,std::ostream&
- 而不是您想要的std::stringstream
。
答案 1 :(得分:1)
有几个问题。首先,正如Yuushi指出的那样,
表达式ss << "MB"
的类型是std::ostream&
,
而不是std::stringstream
,并且没有隐式转换
从std::ostream
到std::stringstream
。第二是
流是不可复制,所以你永远无法做到
返回std::stringstream
(需要副本)。和
你不能简单地将返回值更改为std::ostream&
,
因为这会导致返回对本地的引用
变量; ss
将在函数结束时被破坏。
你想要达到什么目的?大多数时候,只是
返回一个字符串(ss.str()
)将是一个更好的解决方案。