#c #stl #compiler-errors #stringstream #stlport
#c #stl #ошибки компилятора #stringstream #stlport
Вопрос:
У меня есть конструктор класса следующим образом:
DotDashLogMatcher( std::stringstream constamp; pattern );
Я называю это так:
std::stringstream s;
DotDashLogMatcher( s << "test" );
Это слишком упрощенный пример, но это, по сути, то, что происходит. Вот точная ошибка компилятора, которую я получаю. Обратите внимание, что по какой-то причине результирующий объект, который передается, является basic_ostream , я не уверен, нормально ли это. Он не может преобразовать его в std::stringstream, как ожидает моя функция.
error C2664: 'DotDashLogMatcher::DotDashLogMatcher(const stlpd_std::stringstream amp;)' : cannot convert parameter 1 from 'stlpd_std::basic_ostream<_CharT,_Traits>' to 'const stlpd_std::stringstream amp;'
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.
Кто-нибудь знает, где я здесь ошибаюсь? Почему этот код не компилируется? Заранее прошу прощения, если мне не хватает информации. Я обновлю свой вопрос для тех, кто запрашивает дополнительную информацию.
Ответ №1:
operator<< не возвращает std::stringstream, поскольку он унаследован от std::ostream . См.:
http://www.cplusplus.com/reference/iostream/stringstream/
Вы можете использовать:
DotDashLogMatcher(ы);
Или вы можете изменить объявление своего метода, чтобы соответствовать возвращаемому типу.
Комментарии:
1. Какой смысл иметь stringstream, если у него нет соответствующих операторов потоковой передачи? Я удивлен, что для stringstream нет перегрузок
2. @Robert: Суть динамического полиморфизма в том, что вам все равно, какой тип потока что-то есть. Почему ваш интерфейс требует
stringstream
именно этого?3. @ildjarn Для вызова str(), конечно, чтобы получить из него std::string . Я не хотел вызывать str() каким-то тупым способом вне функции.
4. std::stringstream наследует операторы потоковой передачи, поэтому вы можете использовать их в обычном режиме. Преимущество заключается в том, что код операторов не дублируется. Недостатком является то, что вы не можете использовать результат этих операторов в качестве std::stringstream . Вы можете использовать его: DotDashLogMatcher(static_cast<std::stringstream const amp;>(s << «test»)); Или использовать оператор запятой: DotDashLogMatcher( (s << «test», s) ); Однако я думаю, что использование двух строк здесь является лучшим решением: s<< «тест; DotDashLogMatcher(ы);
Ответ №2:
Я считаю, что вам следует разделить оператор на две отдельные команды:
s << "test";
DotDashLogMatcher( s );
поскольку параметр передается по ссылке и, следовательно, должен быть модифицируемым, следовательно, l-значение.
Комментарии:
1. Разделение операторов работает, но не по той причине, о которой вы думаете.
Ответ №3:
Может быть, вы хотите изменить:
DotDashLogMatcher( std::stringstream constamp; pattern );
В:
DotDashLogMatcher( std::ostream constamp; pattern );
Проблема в том, что operator <<
он перегружен для std::ostream и возвращает a std::ostream
.
Если вы не можете его изменить, есть несколько обходных путей.
std::stringstream s;
s << "test"
DotDashLogMatcher( s );
// slightly more dangerious but should work.
std::stringstream s;
DotDashLogMatcher( static_cast<std::stringstream constamp;>(s << "test") );