sirve que programacion prefijo para nombres namespace está espacio dev definido c++ c++11 namespaces inline-namespaces

c++ - programacion - que es namespace en c#



¿Cómo puedo referirme explícitamente a un espacio de nombres adjunto cuando existe un espacio de nombres en línea? (3)

No creo que pueda referirse a ool ambigua cuando un espacio de nombres en línea tenga un método con el mismo nombre ool .

Pero puedes probar esto;

#include <iostream> namespace Foo{ inline namespace A { void ool() // Version A { std::cout << "Foo::ool" << std::endl; } } namespace Bar{ void ool() // Version B { std::cout << "Foo::Bar::ool" << std::endl; } } } int main() { Foo::ool(); // no error }

  1. Ajuste los métodos en el namespace Foo de namespace Foo en un namespace A luego inline namespace A inline namespace A inline namespace A
  2. Eliminar en línea de la Bar .

Ahora si haces una llamada Foo::ool(); invocará en inline A::ool()
Bar::ool puede ser invocado por Foo::Bar::ool

Por favor considere este código:

#include <iostream> namespace Foo{ void ool() // Version A { std::cout << "Foo::ool" << std::endl; } inline namespace Bar{ void ool() // Version B { std::cout << "Foo::Bar::ool" << std::endl; } } } int main() { Foo::ool(); // <- error }

Tanto Clang como G ++ marcan correctamente Foo::ool como ambiguo. Puedo llamar a Foo::Bar::ool sin problema, pero ¿hay alguna forma de llamar a la versión A sin cambiar su declaración?

Encontré personas en una posición similar tratando de entender lo que sucede pero no vi una solución para este caso.

Estoy en esta situación porque tengo un proyecto que incluye una declaración de std::__1::pair y std::pair , realizado en diferentes lugares, siendo std::__1 un espacio de nombres en línea. Necesito el código para apuntar al std::pair explícitamente. ¿Hay una solución para eso?


No creo que sea posible; de cppreference :

La búsqueda de nombres calificada que examina el espacio de nombres adjunto incluirá los nombres de los espacios de nombres en línea incluso si el mismo nombre está presente en el espacio de nombres adjunto.

Sin embargo, parece que no está realmente en la situación que describe, ya que dice que las dos definiciones se extraen de diferentes archivos. Por lo tanto, se "marca" la definición más externa para poder llamarlo cuando lo necesite:

#include <iostream> // Equivalent of first include namespace Foo{ void ool() // Version A { std::cout << "Foo::ool" << std::endl; } } const auto& foo_ool = Foo::ool; // Equivalent of second include namespace Foo{ inline namespace Bar{ void ool() // Version B { std::cout << "Foo::Bar::ool" << std::endl; } } } int main() { foo_ool(); // Works }

Si lo que desea marcar es un tipo, una simple directiva de using debería ser suficiente. El código equivalente para ti se vería así:

#include <my_first_include> // bookmark code #include <my_second_include> // rest of the code


No se puede hacer referencia inequívoca al símbolo definido en el espacio de nombres adjunto una vez que se ha visto el espacio de nombres en línea.

En particular para su caso, la búsqueda calificada en main está marcada correctamente como ambigua (como usted mismo dijo). Vea el último punto en cppreference :

La búsqueda de nombres calificada que examina el espacio de nombres adjunto incluirá los nombres de los espacios de nombres en línea incluso si el mismo nombre está presente en el espacio de nombres adjunto.

Sin embargo, como se señaló en otros comentarios, es probable que esté enfrentando un problema de configuración en la invocación de su cadena de herramientas cuando intenta usar std::pair .

Para solucionar su problema, debe asegurarse de que se invoque el compilador para compilar el código C ++ 11, que estaría con el indicador:

-std=c++11 o -std=c++0x dependiendo de su versión de Clang / GCC

Para dar más contexto:
El espacio de nombres en línea es una característica de C ++ 11, introducida principalmente para permitir la creación de versiones de símbolos en bibliotecas. Una implementación de la biblioteca estándar de C ++ podría entonces definir diferentes versiones de símbolos en espacios de nombres anidados (con nombres no estándar), y dependiendo de la versión de la biblioteca solicitada al compilar, la cadena de herramientas define uno de esos espacios de nombres anidados como en línea. Parece que está usando una versión c ++ 11 de la biblioteca (ya que define algunos símbolos, en particular el pair , en el espacio de nombres en línea _1 ), por lo que tiene símbolos en un espacio de nombres en línea en realidad lo que desea.