C ++ шаблонизирует вывод: iostream или fstream - PullRequest
0 голосов
/ 07 июля 2011

Как шаблонизировать объекты 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;
}

Ответы [ 2 ]

2 голосов
/ 07 июля 2011

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

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

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

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

0 голосов
/ 07 июля 2011

Ваша функция шаблона работает для меня идеально, хотя в вашей функции 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;
}

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

...