Tengo dos espacios de nombres que tienen una función con el mismo nombre. Si desde uno de los espacios de nombres quiero llamar a la función que coincida con la mejor. Desde una función en NamespaceA, si llamo a MyFunction (...), por supuesto, usa el que está en NamespaceA. Sin embargo, si agrego un 'using NamespaceB :: MyFunction', entonces esperaría el comportamiento que describí. Sin embargo, lo que realmente veo es que SIEMPRE encuentra la función NamespaceB, aunque estoy en NamespaceA. SIN EMBARGO, si TAMBIÉN agrego un using :: NamespaceA (aunque ya estoy en NamespaceA), funciona como esperaba. Una demostración es abajo. ¿Alguien puede explicar cómo funciona esto?Orden de búsqueda del espacio de nombres
#include <iostream>
namespace NamespaceA
{
void DoSomething();
void MyFunction(int object);
}
namespace NamespaceB
{
void MyFunction(float object);
}
namespace NamespaceA
{
void DoSomething()
{
using NamespaceA::MyFunction; // Note that without this line the lookup always fins the NamespaceB::MyFunction!
using NamespaceB::MyFunction;
MyFunction(1);
MyFunction(2.0f);
}
void MyFunction(int object)
{
std::cout << "int: " << object << std::endl;
}
}
namespace NamespaceB
{
void MyFunction(float object)
{
std::cout << "float: " << object << std::endl;
}
}
int main(int argc, char *argv[])
{
NamespaceA::DoSomething();
return 0;
}
En una palabra, "mal" . Si desea sobrecargar 'MyFunction', simplemente ponga ambas implementaciones en el mismo espacio de nombres, y permita que el mecanismo de sobrecarga del compilador descubra cuál es la mejor coincidencia. –
¿Ha probado esto en dos compiladores diferentes o ha intentado descubrir cuál debería ser el comportamiento estándar? –
@DavidThornley: Este _es_ comportamiento estándar. Aunque tienes razón en eso, el OP debería haber hecho una prueba cruzada. –