У меня есть этот пример кодас использованием директивы - почему так странное поведение?
namespace ns1
{
void foo(int)
{
}
}
namespace ns2
{
void foo()
{
}
void bar()
{
using namespace ::ns1;
foo(42); // why compiler can't just call ns1::foo?
}
}
И это не компилируется с ошибкой:
prog.cpp:16:9: error: too many arguments to function ‘void ns2::foo()’
Я нашел причину этой ошибки в стандарте C++ 2003:
A using-directive specifies that the names in the nominated namespace can be used in the scope in which the using-directive appears after the using-directive. During unqualified name lookup (3.4.1), the names appear as if they were declared in the nearest enclosing namespace which contains both the using-directive and the nominated namespace. [Note: in this context, “contains” means “contains directly or indirectly”. ]
какие-либо Обоснование за это странное правило? Почему имена из пространства имен ns1 не могут непосредственно отображаться в пространстве имен ns2?
Поскольку я никогда не видел, чтобы «использование» использовалось таким образом, я рискну предположить. Он пытается вывести имя в текущее пространство имен и, вероятно, не так, как вы намереваетесь входить только в контекст функции. Вероятно, столкновение двух функций является проблемой. – Photon
Вы даете компилятору выбор, как ns1 :: foo, так и ns2 :: foo в области. Какой, по-вашему, он должен выбрать? Ближайший или самый дальний? Вам нравится, когда компилятор выбирает глобальную переменную с тем же именем, что и параметр функции? И если вы скажете «ns1 :: foo, конечно!» то почему бы просто не написать так? –
Согласно D & E, используемые директивы «дают имена доступным». Поскольку мы (потенциально) не знаем, что полный набор имен стал доступным, он более консервативен и помещает их дальше в иерархию пространства имен (чтобы они не случайно скрывали имена). Ближайшее охватывающее пространство имен может интерпретироваться как общая часть программы; что-либо заключенное менее специализировано, все заключенное является более специализированным и поэтому должно иметь приоритет. Но я просто догадываюсь. – dyp