станд :: ostream :: Оператор & л; & л; не определен для std :: string?

Я наткнулся на ошибку, по которой я не могу понять причину.

Я думаю, что это в основном сводится к этой ошибке:

 error: no matching function for call to ‘std::basic_ostream<char>::operator<<(const std::basic_string<char>&)’

Я посмотрел в спецификации на www.cplusplus.com и действительно, он говорит, что нет определения для std::ostream::operator<< с std::string в качестве аргумента.

Мой вопрос: что происходит, когда кто-то пишет std_ostream_instance << std_fancy_string;, Я считаю, что это один из самых распространенных призывов (например, std::out << std::string("Hello world!") ) рядом с const char*,

Ошибка происходит из этих строк:

template<typename T>
void Log::_log(const T& msg)
{  _sink->operator<<( msg ); }

_sink определяется как std::ostream*
Есть несколько функций обёртывания, но они ломаются здесь.

Я думаю, что я мог бы обойти, написав

template<>
void Log::_log<std::string>(const std::string& msg) {
_sink->operator<<( msg.c_str() );
}

так как есть ostream& operator<< (ostream& out, const unsigned char* s ); определяется по умолчанию.

Я просто не вижу причин, почему он не угадывается автоматически, поскольку он явно работает в простом использовании, как cout << any_std_string,

Не уверен, что это уместно, но я хочу иметь возможность передавать через мои функции журнала все, что может быть обработано std::ostream, Я использовал явные не шаблонные объявления, но решил перейти к шаблону для log(const T& anything_to_log) перевоспитать это. Казалось, глупо иметь 5+ перегрузок. Я получаю ошибку, когда пытаюсь скомпилировать что-то вроде Log::log( std::string("test case") ),

Это выглядит как-то глупо-просто, но я не могу получить это самостоятельно. Пробовал гуглить и искать в стеке безрезультатно.

С уважением, luk32.

PS. Я проверил обходной путь, и он работает. Почему это неявно сделано?

3

Решение

operator << перегрузки не являются членами ostream, Например, это автономные функции

ostream& operator << ( ostream& out, const basic_string<T>& bs );

Пытаться

template<typename T>
void Log::_log(const T& msg)
{  *_sink << msg;  }
9

Другие решения

std::string версия не является функцией-членом, поэтому не может быть вызвана как член _sink, Попробуйте использовать этот способ для получения версий для членов и не членов (на самом деле маловероятно, что вам все равно понадобятся версии для членов):

#include <iostream>
#include <string>

int main()
{
std::ostream * os = &std::cout;
std::string s = "Hello\n";

// This will not work
// os->operator<<(s);
(*os) << s;

return 0;
}

Или еще лучше было бы хранить _sink в качестве справки, и вывод в точности так, как вы обычно это делаете cout,

5

По вопросам рекламы [email protected]