4

例如:

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)

4

2 回答 2

8

因为您要返回最后一个评估的语句。考虑一下这实际上在做什么:

return ss << "MB";

相当于:

return operator<<(ss, "MB");

operator<<如您所见,在这种情况下,返回类型是std::ostream&- 不是std::stringstream您想要的 a。

于 2013-05-10T08:26:00.210 回答
1

有几个问题。第一个是,正如 Yuushi 指出的那样,表达式的类型ss << "MB"std::ostream&,而不是std::stringstream,并且没有从std::ostreamto的隐式转换std::stringstream。第二个是流不可复制,因此您永远无法返回 a std::stringstream(这将需要副本)。而且您不能简单地将返回值更改为std::ostream&,因为这会导致返回对局部变量的引用;ss将在函数结束时销毁。

你想达到什么目的?大多数时候,只返回一个字符串 ( ss.str()) 会是更好的解决方案。

于 2013-05-10T09:36:55.343 回答