cs223pa1-applying-layered-class-templates