Проблема, с которой вы столкнулись, заключается в том, что, хотя T *
можно неявно преобразовать в T const *
, система шаблонов не «знает» об этом, поэтому whatever<T *>
и whatever<T const *>
- это совершенно не связанные типы и нет неявного преобразования из одного в другое.
Чтобы избежать проблемы, я бы, вероятно, вообще не передавал коллекцию. Вместо этого я бы сделал так, чтобы функция брала пару итераторов. list<A *>::iterator
может быть неявно преобразовано в list<A *>::const_iterator
. Впрочем, я бы, вероятно, сделал функцию шаблоном, чтобы он мог принимать итераторы произвольного типа.
Это, скорее всего, избавит вас от многих неприятностей - list
редко является хорошим выбором контейнера, так что есть очень большой шанс, что когда-нибудь вы захотите перейти с list<A *>
на vector<A *>
или, возможно, deque<A *>
- и если вы сделаете свою функцию универсальной, вы сможете сделать это без переписывания функции вообще.