c++ template ch 16 17 20 21