Я думаю, что вы можете захотеть что-то вроде этого:
void C::f(B &ptr){ // reference not a pointer
A<B> b_in_a(B) ;
vec.push_back(b_in_a); // gives error
}
Убедитесь, что операторы копирования, присваивания и сравнения являются ПОЛНОСТЬЮ реализуемыми, если в каком-либо шаблоне контейнера вы используете что-то кроме указателя. Также помните, что если вы не используете указатели, вы не можете хранить подклассы в своих контейнерах.