Сионист писал(а):И? А почему он не наследуется?
Потому, что так сказал дедушка Страуструп. Это закреплено стандартом, который ты никак не хочешь прочесть.
Сионист писал(а):А зачем мне писать свои манипуляторы? Они всё равно ничего нового не делают.
А где я написал, что нужно написать свой манипулятор? Прочти ещё раз моё сообщение. Там было написано об операторе, принимающем стрим (!), который возвращает манипулятор.
Сионист писал(а):Это с какого? Оператор принимает и возвращает мой класс. Если Вы не в состоянии даже отличить синтаксис перегрузки от завёрнутого в тело применения функции над предком, то какого берётесь оценивать чьи то знания? Тест, кстати, тоже говорит от обратном..
Мне кажется именно ты не разбираешься в синтаксисе. Можешь мне объяснить, что обозначает вот это объявление?
Код: Выделить всё
typedef std: :o stream &(*TManipulator)(std: :o stream &Stream);
Давай я расшифрую, так как у тебя с этим проблемы, судя по последнему сообщению. Тут объявляется тип. Этот тип является указателем на функцию, которая принимает ссылку на стандратный стрим и возвращает ссылку на стандратный стрим. Далее смотрим сюда:
Код: Выделить всё
TMyStream &operator << (const TManipulator Manipulator)
Это оператор, который принимает указатель на функцию (а совсем не твой класс, как ты пишешь). Не вдаваясь даже в то, что const тут бесполезен, перейдём к вызову этого оператора.
Фактически в этом месте MinGW подставляет тебе перед std::endl оператор взятия адреса, то есть код выглядит вот так:
Как следствие, оператор получает манипулятор, как указатель на функцию (коим он, по сути, и является) и потом, внутри себя вызывает эту функцию:
Это работает лишь потому, что у тебя MinGW. Не все компиляторы подставляют автоматически амперсанд в том месте, где нужен указатель на функцию, об этом мы с тобой разговаривали пару месяцев назад в другой теме.
Что ты теряешь? При таком подходе ты не можешь приклеить к манипулятору справа через << выражения, как это все привыкли делать. Не говоря уже о том, что это просто ужасное решение с архитектурной точки зрения.
А теперь внимательно прочти мой предыдущий пост ещё раз, и ты сможешь понять, как нужно поменять код, чтобы всё было хорошо.