2011-07-07 2 views
0

Как templatize объекты iostream и fstream? Этот способ (см. Код, пожалуйста) неправильный ... Спасибо за вашу помощь.C++ templatize output: iostream или fstream

template <typename O> 
void test(O &o) 
{ 
    o << std::showpoint << std::fixed << std::right; 
    o << "test"; 
} 

int main(int argc, _TCHAR* argv[]) 
{ 
    std::iostream out1; //Write into console 
    std::ofstream out2 ("file.txt"); //Write into file 
    .... 

    test(out1); 
    test (out2); 

    return 0; 
} 
+0

Просьба предоставить * полную * минимальную программу выборки и полные сообщения об ошибках, которые вы видите при компиляции или запуске. Для получения дополнительной информации о том, как и зачем это делать, см. Http://sscce.org. –

ответ

0

Ваша функция шаблона отлично работает для меня, хотя у вашей функции main были серьезные ошибки. После фиксации ваших ошибок, эта программа работает для меня:

#include <iostream> 
#include <fstream> 


template <typename O> 
void test(O &o) 
{ 
    o << std::showpoint << std::fixed << std::right; 
    o << "test"; 
} 

int main(int argc, char* argv[]) 
{ 
    // std::iostream out1; //Write into console 
    std::ofstream out2 ("file.txt"); //Write into file 
// .... 

    test(std::cout); 
    test (out2); 

    return 0; 
} 

Я не уверен, почему вы хотите шаблонную функцию, хотя. Регулярный полиморфизм в этом конкретном случае имеет больший смысл.

+0

Спасибо за вашу помощь. – Johnas

2

Есть две проблемы:

  1. Чтобы сделать функцию, которая может записывать в произвольной выходной поток, вам не нужно, чтобы сделать его шаблон. Вместо этого, если в качестве параметра он принимает ссылку по ссылке. ostream - это базовый класс всех объектов выходного потока, поэтому функция может принимать любой выходной поток.

  2. Класс iostream - это абстрактный класс, который не может быть непосредственно создан. Он разработан, чтобы быть базовым классом других классов потоков, которые можно читать и писать, например, fstream и stringstream. Если вы хотите печатать на консоль, используя функцию pass cout в качестве параметра.

Надеюсь, это поможет!

+0

Спасибо за ваши полезные комментарии ... – Johnas