std :: pair / ostringstream ctor语法

时间:2016-01-15 00:47:54

标签: 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的“单行”创建和填充,正如我在第一个代码块中尝试做的那样。谢谢。

1 个答案:

答案 0 :(得分:1)

您用于编写字符串文字的operator<<函数需要basic_ostream&并返回basic_ostream&。但strbasic_ostringstream的成员,因此您无法在basic_ostream&上调用它。

您可以转换返回值,您的代码将编译

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

此外,由于flush默认构造的stringstream是没有意义的,你应该摆脱它。