2015-08-06 5 views
4

Я работаю с кодом, который использует глобальный регистратор отладки, который имеет тип std::ofstream*. Я хотел бы перенаправить это на std :: cout, поскольку я использую код в режиме реального времени, а не пакетный метод, для которого он был разработан.Как перенаправить std :: ofstream в std :: cout?

Можно ли переназначить глобальный указатель std::ofstream*, который он использует, чтобы std::cout? Я знаю, что std::ofstream наследуется от std::ios, который позволяет изменять буфер потока с помощью метода rdbuf(), но, к сожалению, появляется std::ofstream переопределяет rdbuf() метод, который делает следующий код не компилируется:

gOsTrace = new std::ofstream(); 
gOsTrace->rdbuf(std::cout.rdbuf()); 

Есть еще один способ перенаправить объект gOsTrace, чтобы указать на cout?

+8

ли регистратор должен использовать 'станд :: ofstream *' Может не быть более общим 'станд :: ostream *'. Тогда все, что вам нужно сделать, это присвоить этому указателю новый поток. –

+0

std :: ios :: tie? http://www.cplusplus.com/reference/ios/ios/tie/ –

+2

@SeverinPappadeux, все, что делает это время от времени. Например, 'std :: cin' сбрасывает' std :: cout', когда есть операция ввода. – chris

ответ

6

Метод конкретных классов потока IOStream скрывает объект, объявленный в std::ios. Вам потребуется явное квалификацию для того, чтобы найти перегрузки базового класса:

gOsTrace->basic_ios<char>::rdbuf(std::cout.rdbuf()); 
+0

Спасибо! Это работает. Следует отметить, однако, что на самом деле он не будет перенаправлен на std :: cout, если сервер не откроет файл для записи. То есть конструктор по умолчанию, как в моем коде, не будет перенаправлен. – stix

Смежные вопросы