Вы, вероятно, хотите / нуждаетесь (*p1)->print();
Как есть, оно будет проанализировано, как если бы вы написали *(p1->print());
Скорее всего, 20: 1, вам действительно лучше хранить Student
с вместо Student *
с.
Как только вы это исправите, вы, вероятно, захотите избавиться от Student::print()
и вместо этого предоставить std::ostream &operator<<(std::ostream &, Student const &);
. Имея это в виду, вы можете сделать что-то вроде:
std::cout << *p1;
и (например) печать всего массива работает примерно так:
std::copy(students.begin(), students.end(),
std::ostream_iterator<Student>(std::cout, "\n"));