El problema que tiene es que a pesar de T *
se puede convertir implícitamente a un T const *
, el sistema de plantillas no es "consciente" de que, por lo que un whatever<T *>
y whatever<T const *>
son tipos que no tienen relación, y no hay conversión implícita de una al otro.
Para evitar el problema, probablemente evitaría pasar una colección. En su lugar, haría que la función tomara un par de iteradores. Un list<A *>::iterator
puede convertirse implícitamente en un list<A *>::const_iterator
. Para el caso, probablemente haga de la función una plantilla, por lo que puede tomar iteradores de tipo arbitrario.
Es probable que esto le ahorrará un poco de problemas - una list
es rara vez una buena opción de contenedor, por lo que hay una gran posibilidad de que algún día querrá cambiar de list<A *>
a vector<A *>
o tal vez deque<A *>
- - y si hace que su función sea genérica, podrá hacerlo sin tener que volver a escribir la función.
¿Intentó pasar la lista tal como es? Si es así, ¿qué obtuviste? – Oswald
@Oswald, un horrible error de conversión de plantilla – vondip
Algo así como 'error: conversión de 'std :: list >' a tipo no escalar 'std :: list> 'requested'? –
James