2016-01-15 3 views
3

Почему следующий код ...Std :: пара/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; 
} 

Если кто-нибудь может посоветовать, как я бы в идеале хотелось стащить «один-линии» создание и население моего станд :: пары, как я пытаюсь сделать в первом блоке кода. Спасибо.

ответ

1

Функция operator<<, которую вы используете для записи строковых литералов, принимает basic_ostream& и возвращает basic_ostream&. Но str является членом basic_ostringstream, поэтому вы не можете вызвать его на basic_ostream&.

Можно, возвращаемое значение, и ваш код компилируется

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

Кроме того, поскольку flush ИНГ конструктором по умолчанию stringstream бессмысленно, вы должны избавиться от этого.

+0

спасибо. Ваш ответ, тем не менее, вызывает у меня озабоченность по поводу того, что базовый_поток базового_потока для базового_строчного потока. Это считается безопасным, потому что basic_ostream &, возвращаемый оператором <<, на самом деле является тем же самым rvalue ostringstream, по которому он вызывается? – StoneThrow

+0

@StoneThrow Возвращенный 'ostream &' относится к экземпляру базового класса созданного вами экземпляра 'ostringstream', поэтому абсолютно безопасно вернуть его обратно к исходному типу. – Praetorian

Смежные вопросы