Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > std::basic_ostream


Автор: dix75 17.6.2008, 20:07
Всем Доброго вечера!
У меня вопрос такой
нашел я одну функцию в книге (Рэй Лишнер "C++ справочник"), а примера использования функции нет 

Функция копирования файла
Код

template <typename charT, typename trains>
void TCopyList::copy(std::basic_ostream<charT,trains>&out, std::basic_ostream<charT,trains>&in)
{
out <<in.rbuf();
}


Но как пользоватья ей я не знаю 
Может кто-нить напишет как ей пользоваться

Автор: JackYF 17.6.2008, 20:15
Цитата(dix75 @  17.6.2008,  19:07 Найти цитируемый пост)
std::basic_ostream<charT,trains>&in

здесь должен быть istream, вестимо.

Пример:

Код

TCopyList::copy(std::cout, std::cin);

Автор: Mephisto 17.6.2008, 20:19
Не пойму почему basic_ostream описан как in.
Но если так как я написал, то понятно :
Код

#include <iostream>
#include <fstream>

using namespace std;

template <typename charT, typename trains>
void copy(std::basic_ostream<charT,trains>&out, std::basic_istream<charT,trains>&in)
{
out <<in.rdbuf();
}

int main (){
  ifstream t("test.txt");
  copy(cout, t);
  return 0;
}


Автор: dix75 17.6.2008, 20:23
Mephisto
Прошу прощения действительно  basic_istream

Автор: dix75 17.6.2008, 20:42
Ошибка :(

Код

[ILINK32 Error] Error: Unresolved external 'void TCopyList::copy<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, std::basic_istream<char, std::char_traits<char> >&)' referenced from C:\B2008\DEBUG\B2008.OBJ

Автор: vinter 17.6.2008, 20:53
бедовая -фия, нафига она тебе нужна, лучше напрямую функционал ею используемый пользовать smile

Цитата(dix75 @  17.6.2008,  21:42 Найти цитируемый пост)
Ошибка :(

она у тебя объявлена\определена?
Цитата(dix75 @  17.6.2008,  21:07 Найти цитируемый пост)
trains

я думаю должно быть traits, а уж никак не trains  smile 

Автор: dix75 17.6.2008, 21:03
исправил на traits
результат Не помогло

Пытаюсь работать так
Код

TCopyList *List;
ifstream in("C:\\cx.txt");
ofstream out("C:\\cx1.txt");
List->copy(out, in);

Автор: baldina 17.6.2008, 21:16
у тебя std::basic_ostream<charT,trains>&out не согласуется с ofstream который есть basic_ofstream<char, char_traits<char> > и т.д.

Добавлено через 5 минут и 7 секунд
не, ошибся, согласуется все.

Добавлено через 6 минут и 11 секунд
у тебя просто шаблон TCopyList::copy видимо в cpp файле, перенеси его в .h  и все

Автор: dix75 17.6.2008, 21:29
baldina

размещаю в секции public 
другая ошибка  smile 

Код

[BCC32 Error] List.h(28): E2316 'rbuf' is not a member of 'istream'

Автор: vinter 17.6.2008, 21:44
а iostream подключен в .h? std?

Автор: andrew_121 17.6.2008, 21:45
Цитата(dix75 @  17.6.2008,  21:29 Найти цитируемый пост)
[BCC32 Error] List.h(28): E2316 'rbuf' is not a member of 'istream'

По моему - rdbuf

Автор: baldina 17.6.2008, 21:47
vinter,  smile 
dix75, проверяй iostream в .h

Добавлено через 51 секунду
да, rdbuf конечно

Автор: dix75 17.6.2008, 21:52
Прикольно действительно rdbuf  smile 
Непонятно почему в cpp нельзя?

А как мона дописать файл?

Автор: andrew_121 17.6.2008, 22:08
Цитата(dix75 @  17.6.2008,  21:52 Найти цитируемый пост)
А как мона дописать файл?

Путем Чтения и Записи  smile 

Автор: dix75 17.6.2008, 22:15
andrew_121

smile

вот так я думаю smile

Код

TirdImageList *List;
std::ifstream in("C:\\cx.txt");
std::ofstream out("C:\\cx1.txt",ios::app);
List->copy(out, in);


Добавлено через 2 минуты и 16 секунд
Меня мучает вопрос почему нельзя писать реализацию функции в cpp?

Автор: baldina 17.6.2008, 22:24
шаблон - это не готовый код класса или функции, это инструкция компилятору, как их создавать. поэтому шаблон должен быть у компилятора "под рукой". Есть способ принудительной генерации кода по шаблону для заданных типов, но в данном случае этого не надо. Пусть тебя .h не смущает, посмотри тексты STL - там все во включаемых файлах.
Наконец, есть такая штука, как экспорт шаблонов, но с поддержкой этой фичи со стороны компиляторов пока плоховато.

Автор: vinter 17.6.2008, 22:32
Цитата(dix75 @  17.6.2008,  23:15 Найти цитируемый пост)
Меня мучает вопрос почему нельзя писать реализацию функции в cpp?

можно, и нужно
Цитата(dix75 @  17.6.2008,  23:15 Найти цитируемый пост)
вот так я думаю

в смысле, ты думаешь улыбаясь?

Автор: dix75 17.6.2008, 22:33
причем постоянно smile


в cpp выдает ошибку описанную ранее

Автор: vinter 17.6.2008, 23:03
Цитата(dix75 @  17.6.2008,  23:33 Найти цитируемый пост)
в cpp выдает ошибку описанную ранее

ну это я имел в виду про обычные ф-ии, а у тебя объявление шаблона в .h а реализации в cpp, да? Если так, то с шаблонами так нельзя.

Автор: dix75 17.6.2008, 23:12
спасибо

Автор: bsa 17.6.2008, 23:12
Цитата(vinter @ 17.6.2008,  23:03)
Если так, то с шаблонами так нельзя.

По крайней мере до тех пор, пока компиляторы не поддержат extern template...

Автор: vinter 17.6.2008, 23:33
Цитата(bsa @  18.6.2008,  00:12 Найти цитируемый пост)
По крайней мере до тех пор, пока компиляторы не поддержат extern template...

export если быть точным smile

Автор: bsa 17.6.2008, 23:35
vinter, точно.  smile 

Автор: xvr 18.6.2008, 11:35
Цитата(bsa @ 17.6.2008,  23:12)
Цитата(vinter @ 17.6.2008,  23:03)
Если так, то с шаблонами так нельзя.

По крайней мере до тех пор, пока компиляторы не поддержат extern template...

Эх, sun'овский C++ компилятор поддерживал это еще более 10 лет назад (правда без слова export, не было его еще тогда  smile )

Автор: Mephisto 18.6.2008, 14:13
Цитата(dix75 @  17.6.2008,  22:52 Найти цитируемый пост)
Прикольно действительно rdbuf  smile 
Непонятно почему в cpp нельзя?

я, в своем примере rdbuf и написал smile

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)