Проблемы выбора оператора stringstream - PullRequest
1 голос
/ 19 октября 2011

У меня есть конструктор класса примерно так:

DotDashLogMatcher( std::stringstream const& pattern );

Я называю это так:

std::stringstream s;
DotDashLogMatcher( s << "test" );

Это слишком упрощенный пример, но это, по сути, то, что происходитна.Вот точная ошибка компилятора, которую я получаю.Обратите внимание, что по какой-то причине переданный объект является basic_ostream, я не уверен, что это нормально.Он не может преобразовать его в поток std :: stringstream, как ожидает моя функция.

error C2664: 'DotDashLogMatcher::DotDashLogMatcher(const stlpd_std::stringstream &)' : cannot convert parameter 1 from 'stlpd_std::basic_ostream<_CharT,_Traits>' to 'const stlpd_std::stringstream &'
        with
        [
            _CharT=char,
            _Traits=stlpd_std::char_traits<char>
        ]
        Reason: cannot convert from 'stlpd_std::basic_ostream<_CharT,_Traits>' to 'const stlpd_std::stringstream'
        with
        [
            _CharT=char,
            _Traits=stlpd_std::char_traits<char>
        ]
        No constructor could take the source type, or constructor overload resolution was ambiguous

Я использую VS2003 и STLport в Windows.

Кто-нибудь знает, где яидет не так здесь?Почему этот код не скомпилируется?Я заранее прошу прощения, если мне не хватает информации.Я обновлю свой вопрос для тех, кто запрашивает дополнительную информацию.

Ответы [ 3 ]

1 голос
/ 19 октября 2011

operator << не возвращает std :: stringstream, потому что он унаследован от std :: ostream. См: </p>

http://www.cplusplus.com/reference/iostream/stringstream/

Вы можете использовать:

DotDashLogMatcher (s);

Или вы можете изменить объявление метода, чтобы оно соответствовало типу возвращаемого значения.

0 голосов
/ 19 октября 2011

Возможно, вы захотите изменить:

DotDashLogMatcher( std::stringstream const& pattern );

Into:

DotDashLogMatcher( std::ostream const& pattern );

Проблема в том, что operator << перегружен для std :: ostream и возвращает std::ostream.

Если вы не можете изменить его, есть несколько обходных путей.

std::stringstream s;
s << "test"
DotDashLogMatcher( s );

// slightly more dangerious but should work.
std::stringstream s;
DotDashLogMatcher( static_cast<std::stringstream const&>(s << "test") );
0 голосов
/ 19 октября 2011

Полагаю, вам следует разделить оператор на две отдельные команды:

s << "test";
DotDashLogMatcher( s );

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

...