c++ - Std::pair/ostringstream 构造函数语法

标签 c++ stdstring ostream std-pair ostringstream

为什么下面的代码...

#include <iostream>
#include <sstream>
#include <utility>

int main()
{
    std::pair<std::string, std::string> pair1((std::ostringstream().flush() << "hello").str(), (std::ostringstream().flush() << "world").str());
    return 0;
}

...生成编译器错误...

>g++ main.cpp
main.cpp: In function ‘int main()’:
main.cpp:7: error: ‘struct std::basic_ostream<char, std::char_traits<char> >’ has no member named ‘str’
main.cpp:7: error: ‘struct std::basic_ostream<char, std::char_traits<char> >’ has no member named ‘str’

...而下面的代码不会产生任何编译器错误?

#include <iostream>
#include <sstream>
#include <utility>

int main()
{
    std::ostringstream oss1;
    std::ostringstream oss2;
    oss1 << "hello";
    oss2 << "world";
    std::pair<std::string, std::string> pair1(oss1.str(), oss2.str());
    return 0;
}

如果有人可以建议如何操作,我理想情况下会像我在第一个代码块中尝试做的那样,完成我的 std::pair 的“单行”创建和填充。谢谢。

最佳答案

operator<< 您用来编写字符串文字的函数采用 basic_ostream&并返回 basic_ostream& .但是 str basic_ostringstream 的成员, 所以你不能在 basic_ostream& 上调用它.

你可以转换返回值,你的代码会编译

static_cast<std::ostringstream&>(std::ostringstream().flush() << "hello")).str()

此外,由于 flush正在默认构造 stringstream毫无意义,你应该摆脱它。

关于c++ - Std::pair/ostringstream 构造函数语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34802532/

相关文章:

c++ - 依赖空 std::string 的索引 0 是不是很糟糕?

c++ - std::string 中的内存泄漏

c++ - 简单的 wostream 日志记录类(带有自定义流操纵器)

c++ - BoundsChecker 显示不正确的内存泄漏消息

c++ - C++ 中的大整数文字源格式

c++ - 当我们为它赋负值时,为什么 char 数据类型表现得像 int 数据类型?

c++ - 将 unsigned char* 数组转换为 std::string

c++ - ostream 和 << 重载的问题

c++ - 如何在 C++ 中编写 ofstream vector ,它接收所有不同的输出流,如 cout、字符串流和 ofstream

c++ - 在 main 启动之前访问命令行