перегрузка оператора << (std::ofstream&, const std::string&)
От: boris_r_v  
Дата: 05.04.12 09:25
Оценка:
Друзья как видно из заголовка, этот оператор уже определен в STL.
Проблема состоит в том, что мне нужна своя реализация его, чтобы записать строку в файл, еще так эже надо писать unsigned long и читать их из файла.
В общем виде это во так выглядит
class vd_data
{
public:
vd_data();
~vd_vata();
std::string _str;
unsigned long _sl;
};

std::ofstream& operator << (std::ofstream&, const vd_data& );
std::ifstream& operator >> (std::ifstream&, vd_data& );

std::ofstream& operator << (std::ofstream&, const std::string& );
std::ifstream& operator >> (std::ifstream&, std::string& );
std::ofstream& operator << (std::ofstream&, const unsigned long& );
std::ifstream& operator >> (std::ifstream&, unsigned long& );

реализацию приводить не буду, пока.

это код успешно компилица, а при запуске имею такую ошибку
... undefined symbol: _ZN3AmtlsERSt14basic_ofstreamIcSt11char_traitsIcEERKm

Если я правильно понял то при запуске случилось что не понятное, символ char_traits не был найден, но какое отношение он имеет я не понял.
Я конечно сделал без последних 4-х операторов заменил их методами

void put( std::ofstream&, const std::string& );
void get( std::ifstream&, std::string& );
void put( std::ofstream&, const unsigned long& );
void get( std::ifstream&, unsigned long& );

но чую — это не кошерно.
Вот посему прошу совета гуру — как заставить мои переопреденные операторы работать, или пояснения почему так не получится сделать.
сдф
Re: перегрузка оператора << (std::ofstream&, const std::stri
От: Тот кто сидит в пруду Россия  
Дата: 05.04.12 09:41
Оценка:
Здравствуйте, boris_r_v, Вы писали:

__>Друзья как видно из заголовка, этот оператор уже определен в STL.

__>Проблема состоит в том, что мне нужна своя реализация его, чтобы записать строку в файл, еще так эже надо писать unsigned long и читать их из файла.

Проще и надежнее всего будет воспользоваться каким-нибудь промежуточным объектом, как, например, это сделано в boost::serialization. Там объекты записываются не в стрим, а в некий archive, который уже и пишет в стрим. А если мешать в кучу форматированный вывод с сериализацией, ничего хорошего в результате не выйдет.
Это, разумеется, если не хочется воспользоваться какой-нибудь готовой библиотекой.
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: перегрузка оператора << (std::ofstream&, const std::stri
От: zaufi Земля  
Дата: 05.04.12 19:02
Оценка: +1
Здравствуйте, boris_r_v, Вы писали:

__>Друзья как видно из заголовка, этот оператор уже определен в STL.

__>Проблема состоит в том, что мне нужна своя реализация его, чтобы записать строку в файл, еще так эже надо писать unsigned long и читать их из файла.

фича в том, что не нужно "переопределять" стандартные operatorы!!

__>В общем виде это во так выглядит

__>class vd_data
__>{
__>public:
__>vd_data();
__>~vd_vata();
__>std::string _str;
__>unsigned long _sl;
__>};

__>std::ofstream& operator << (std::ofstream&, const vd_data& );

__>std::ifstream& operator >> (std::ifstream&, vd_data& );

нужно все делать вот в этих двух операторах!

__>std::ofstream& operator << (std::ofstream&, const std::string& );

__>std::ifstream& operator >> (std::ifstream&, std::string& );
__>std::ofstream& operator << (std::ofstream&, const unsigned long& );
__>std::ifstream& operator >> (std::ifstream&, unsigned long& );

вот эти пеопределять не нужно! использовать их или нет зависит от того что ты хочешь получить. в частности текстовый вид или бинарный...

__>реализацию приводить не буду, пока.


а зря

__>Вот посему прошу совета гуру — как заставить мои переопреденные операторы работать, или пояснения почему так не получится сделать.


и вообще определять операторы конкретно для файловых потоков нехорошо! нужно использовать ostream и istream...
как я уже говорил всю работу нужно выполнять в "своих" operator<</oeprator>> определенных для твоей структуры, прибегая к стандартным при необходимости (или пользуя напрямую read()/write() у stream'a)...
как-то так! я не знаю в точности чего ты хочешь получить
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.