¿Qué parte de la especificación de C++ restringe la búsqueda dependiente de argumentos para que no encuentre plantillas de funciones en el conjunto de espacios de nombres asociados? En otras palabras, ¿por qué la última llamada en main
a continuación no se puede compilar?¿Por qué ADL no encuentra plantillas de funciones?
namespace ns {
struct foo {};
template<int i> void frob(foo const&) {}
void non_template(foo const&) {}
}
int main() {
ns::foo f;
non_template(f); // This is fine.
frob<0>(f); // This is not.
}
¿Quiere decir, que se espera para trabajar FROB() sin escribir ns :: FROB()? – Simon
Sí, en la forma de una función sin plantilla. – Hugh
FYI el código anterior también falla en Comeau: http://www.comeaucomputing.com/tryitout/ - agregando 'using namespace ns;' o 'ns ::' calificación pasa compilación. Esta es una buena pregunta. – fbrereto