Краткий ответ: продолжайте использовать приведение или toStr()
, или напишите свою собственную operator<<
функцию.(Я бы предпочел от l1.toStr()
до (string)l1
.)
Длинный ответ: это могло бы работать, если бы в стандартной библиотеке была функция
std::ostream& operator<<( std::ostream&, std::string const& );
, что она почти выполняет, но не технически.И ostream
, и string
на самом деле являются определениями типов шаблонов.И есть функция шаблона для вставки одной в другую.
// This is somewhat simplified. For the real definitions, see the Standard
// and/or your complying implementation's headers.
namespace std {
typedef basic_string<char> string;
typedef basic_ostream<char> ostream;
template <typename CharT>
basic_ostream<CharT>& operator<<(
basic_ostream<CharT>&,
basic_string<CharT> const&);
}
Так что, когда вы используете cout << str
, где тип str
равен std::string
, он может выяснить, использовать эту функцию шаблона,с CharT = char
.
Но C ++ не позволяет компилятору вычислять как неявное преобразование типа (Literal
в string
), так и выводить параметры шаблона функции шаблона (CharT = char
) натот же звонок.