(Прошу прощения, тут больше я тупил, чем было реально трудностей... Вопрос можно считать закрытым)
Пусть в некотором категорически не олимпиадном, но и не шибко практическом проекте появилось желание сделать такую штуку: создать некий класс Two_ostreams
, чтоб потом можно было создать его экземпляр как-то в стиле Two_ostreams log_and_view("log.txt", cerr);
, и чтоб каждый вызов log_and_view << a+b
, посчитав сумму a+b, писал её сразу и на cerr, и в файл log.txt.
Казалось бы, элементарно:
class Two_ostreams
{
protected:
ostream &ostr1, &ostr2;
public:
Two_ostreams(ostream &o1, ostream &o2) : ostr1(o1), ostr2(o2) { } ;
template<class D> Two_ostreams &operator << (const D &data)
{
ostr1 << data;
ostr2 << data;
return *this;
}
};
Да не тут-то было: оно работает с примитивными типами, для коих перегрузка <<
стандартна, но всё ломается при попытке использовать вышеизложенный Two_ostreams
с классом C
, в котором и определяется собственный friend ostream &operator << (ostream&, const C&)
, и свежеопределённый <<
используется в одном из методов. Конкретнее, в момент компиляции Two_ostreams
ещё нету перегрузки <<
для C
. Полностью переставлять местами, чтобы всё определение C
шло раньше всего определения Two_ostreams
никуда не годится, т.к. хочется именно использовать Two_ostreams
в некоторых методах C
.
Это всё вообще имеет красивое решение? или любой способ будет настолько мрачен, что лучше уж везде по два раза повторять flog << blablabla; cerr << blablabla;
?