Причина, по которой ваши выходные данные выглядят как адреса с настоящим кодом, заключается в том, что вы выводите адрес итератора.
Причина, по которой вы получаете ошибку «не найден оператор, который принимает правый оператор типа« запись »», заключается в том, что нет оператора <<
, который принимает entry
в качестве правого операнда,Вы можете легко определить одно:
std::ostream&
operator<<( std::ostream& dest, entry const& obj )
{
dest << obj.name;
return dest;
}
Но это немного специализировано;в других контекстах вы можете вывести другие поля entry
.Классически, фактически, operator<<
для entry
будет выводить все соответствующие поля.Альтернативным решением было бы определить функциональный объект преобразователя и использовать его:
struct EntryToName
{
std::string operator()( entry const& obj ) const
{
return obj.name;
}
};
Затем в reservations
:
std::transform(
v.begin(), v.end(),
std::ostream_iterator<std::string>( outfile, "\n" ),
EntryToName() );
И кстати, обычно считается предпочтительным передавать векторыпо константной ссылке, а не по значению.