برای سوال دوم ۳ کار میتونید بکنید .
۱ـ از vector ارث ببرید به این شکل :
template<class T>
class Matrix :public std::vector<std::vector<T>>
{
static_assert(std::is_same<T,int>::value ||
std::is_same<T, char>::value, "error");
};
Matrix<int> a;//ok
Matrix<std::string> b;//error
که خب ارث بردن از وکتور بخاطر مثلا virtual نبودن destructor کلاس مشکلاتی داره . در این مورد این لینک اطلاعات نسبتا خوبی داره .
۲ـ راه حل بعد اینه که vector رو به عنوان عضو private کلاس بزارید و متد هایی که می خواهید رو پیاده سازی کنید و با همون assert هم type رو چک کنید .
۳ـ این کار را هم میشه انجام داد :
using MatrixInt=vector<vecetor<int>>;
using MatrixChar=vector<vector<char>>;