2) Для перегрузки оператора присваивания, нужно в шаблонный класс добавить описание метода
OCHERED& operator=(const OCHERED& obj) с покомпонентным присваиванием полей, пример есть в
https://habrahabr.ru/post/132014/
4) В данном случае возиожно будет достаточно использовать int и double только в последнем параметре шаблона (целое или дробное количество страниц). Можно сделать его единственным параметром шаблона.
3) Для исключительных ситуаций лучше описать отдельные классы для разных ситуаций, бросать исключения внутри вызываемой функции Input(), а отлавливать их в месте ее вызова из main().
Ну и для большей осмысленности примера стоит завести список/массив заданий, вводить и печатать их в цикле.