Печать указателя выходов Stringstream - PullRequest
2 голосов
/ 19 июня 2011

Вместо вывода ожидаемой строки "Bar", следующий код выводит то, что выглядит как указатель.

#include <sstream>
#include <iostream>

int main()
{
    std::stringstream Foo("Bar");
    std::cout << Foo << std::endl; // Outputs "0x22fe80."
    return 0;
}

Это можно обойти, используя Foo.str(), но это вызвало некоторые проблемыдля меня в прошлом.Что вызывает это странное поведение?Где это задокументировано?

Ответы [ 3 ]

6 голосов
/ 19 июня 2011

Это можно обойти, используя Foo.str (), но в прошлом это вызывало у меня некоторые проблемы. Что вызывает это странное поведение? Где это задокументировано?

Это совсем не странно.

Поток - это поток, а не строка.

Вы можете получить буфер [string] с помощью функции-члена .str(). Это не обходной путь: это API. Это должно быть задокументировано в вашей стандартной библиотеке ссылок C ++, а если это не так, ваша ссылка является неполной / неправильной.

(* * * * * * * * * * * немного странно, что вы получаете адрес памяти, а не ошибку компиляции; это происходит из-за использования идиома безопасной bool в pre-C + + 0x стандартная библиотека, как описано в другом ответе.)

2 голосов
/ 19 июня 2011

A std::stringstream не должен быть вставлен в поток.Вот почему у вас есть метод str().

Наблюдаемое вами поведение связано с тем, что std::stringstream имеет преобразование в void*, что используется для проверки потока:

if(Foo) { // this uses the conversion to void*
}

В C ++ 11 это преобразование заменяется явным преобразованием в bool, что приводит к тому, что этот код не компилируется:

std::cout << Foo << std::endl;
0 голосов
/ 19 июня 2011

(1) use std :: cout << Foo << std :: endl;Вы должны убедиться, что stringstream уже перегружен "<<".</p>

(2) если нет перегрузки «<<», используйте std :: cout << Foo << std :: endl;может выводить адрес Foo. </p>

...