Mam dwa przestrzenie nazw, z których każdy ma funkcję o tej samej nazwie. Jeśli z jednej z przestrzeni nazw chcę wywołać funkcję, która pasuje do najlepszej. Z funkcji w NamespaceA, jeśli zadzwonię do MyFunction (...), oczywiście korzysta z funkcji w NamespaceA. Jednakże, jeśli dodaję "using NamespaceB :: MyFunction", będę oczekiwał zachowania, które opisałem. Jednak widzę, że ZAWSZE znajduje funkcję NamespaceB, mimo że jestem w NamespaceA. JEDNAKŻE, JEŻELI TAKŻE dodaję używanie :: NamespaceA (nawet jeśli jestem już w NamespaceA), działa tak, jak się spodziewam. Demonstracja znajduje się poniżej. Czy ktoś może wyjaśnić, jak to działa?Porządek wyszukiwania przestrzeni nazw
#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;
}
Jednym słowem, "źle" . Jeśli chcesz przeciążyć 'MyFunction', po prostu umieść obie implementacje w tej samej przestrzeni nazw i pozwól mechanizmowi przeładowczemu kompilatora dowiedzieć się, który jest najlepszy. –
Czy próbowałeś tego w dwóch różnych kompilatorach, czy próbowałeś dowiedzieć się, jakie powinno być standardowe zachowanie? –
@DavidThornley: To jest standardowe zachowanie. Chociaż masz rację, że OP powinien był przejść test sprawdzający. –