【问题标题】:Std::pair/ostringstream ctor syntaxStd::pair/ostringstream ctor 语法
【发布时间】:2016-01-15 00:47:53
【问题描述】:

为什么下面的代码...

#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 的“单行”创建和填充。谢谢。

【问题讨论】:

    标签: c++ stdstring ostream std-pair ostringstream


    【解决方案1】:

    您用来编写字符串文字的operator&lt;&lt; 函数采用basic_ostream&amp; 并返回basic_ostream&amp;。但是strbasic_ostringstream 的成员,所以你不能在basic_ostream&amp; 上调用它。

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

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

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

    【讨论】:

    • 谢谢。不过,您的回答让我担心将 basic_ostream 向下转换为 basic_ostringstream。这是否被认为是安全的,因为 operator
    • @StoneThrow 返回的ostream&amp; 指的是您构造的ostringstream 实例的基类实例,因此将其强制转换回原始类型是绝对安全的。
    猜你喜欢
    • 1970-01-01
    • 2014-08-31
    • 2017-05-21
    • 2015-11-11
    • 1970-01-01
    • 2013-11-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多