2013-05-10 6 views
4

Например:Почему я не могу использовать оператор << << в операторе return?

std::stringstream formatMemUsage(...) { 
    std::stringstream ss ... 
    ... 
    return ss << "MB"; // Error here 
} 

приводит к ошибке no suitable user-defined conversion from "std::basic_ostream<char, std::char_traits<char>>" to "std::stringstream" exists.

I может разделить оператор возврата на 2 утверждения ss << "MB"; return ss; и ошибка исчезнет - почему?

(с использованием MSVC++ 2010)

+0

'' 'перегружен в stringstream для возврата' ostream & '. попробуйте лить. –

+0

Вы можете. Правильно используйте наследование и возвращайте 'std :: ostream &'! –

+0

@LightnessRacesinOrbit: Он не может, так как это приведет к возврату ссылки на локальный объект! – MFH

ответ

8

Поскольку вы возвращаете последнее оцененное заявление. Подумайте, что это на самом деле делает:

return ss << "MB"; 

эквивалентно:

return operator<<(ss, "MB"); 

Тип возврата operator<< в этом случае, как вы уже видели, std::ostream& - ни std::stringstream, как вы хотели.

+0

Спасибо - отсортировано действительно. – mchen

+2

Даже если типы совпадают, потоки не копируются. И возвращаемый тип - 'std :: ostream &'. – jrok

+0

@jrok True, исправлено. – Yuushi

1

Существует несколько проблем. Первый является, как Yuushi указывает, , что тип выражения ss << "MB"std::ostream& является, и не std::stringstream, и не существует неявное преобразование из std::ostream в std::stringstream. Второй заключается в том, что потоки не копируемый, так что вы никогда не сможете вернуть std::stringstream (для чего потребуется копия). И вы не можете просто изменить возвращаемое значение на std::ostream&, , потому что это приведет к возврату ссылки на локальную переменную ; ss будет уничтожен в конце функции.

Что вы пытаетесь достичь? Большую часть времени, только , возвращающее строку (ss.str()), было бы лучшим решением.

+0

На самом деле вы можете вернуть значение 'stringstream' по значению, поскольку они являются подвижными. – MFH

+0

@MFH: В MSVC++ 2010? –

+0

@LightnessRacesinOrbit: В настоящее время я не на ПК с VS 2010, но из того, что я помню, он уже поддерживает семантику перемещения для стандартных типов библиотек. – MFH

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