c++ - sintactica - Ambigüedad del espacio de nombres anónimo
que significa ambigüedad diccionario (5)
La única forma real es colocar el código al que desea acceder a ese espacio de nombres dentro del mismo espacio de nombres. De lo contrario, no hay forma de resolver el espacio de nombres sin nombre, ya que no tiene un identificador que pueda darle para resolver el problema de resolución ambigua.
Si su código está dentro del bloque de espacio de nombres {}, el nombre local tiene prioridad sobre el global, por lo que Foo () llamará a Foo () dentro de su espacio de nombres, y un :: Foo () llamará al espacio de nombres a nivel global alcance.
Considere el siguiente fragmento de código:
void Foo() // 1
{
}
namespace
{
void Foo() // 2
{
}
}
int main()
{
Foo(); // Ambiguous.
::Foo(); // Calls the Foo in the global namespace (Foo #1).
// I''m trying to call the `Foo` that''s defined in the anonymous namespace (Foo #2).
}
¿Cómo puedo referirme a algo dentro de un espacio de nombres anónimo en este caso?
La única solución que se me ocurre que no modifica la disposición del espacio de nombres existente es delegar main
a una función en el espacio de nombres anónimo. ( main
se requiere que sea una función global (§3.6.1 / 1), por lo que no puede estar en un espacio de nombres anónimo.)
void Foo() // 1
{
}
namespace
{
void Foo() // 2
{
}
}
namespace { // re-open same anonymous namespace
int do_main()
{
Foo(); // Calls local, anonymous namespace (Foo #2).
::Foo(); // Calls the Foo in the global namespace (Foo #1).
return 0; // return not optional
}
}
int main() {
return do_main();
}
Mientras que Georg da una respuesta respetable, correcta, correcta y respetable, me gustaría ofrecerle a mi hacky: use otro espacio de nombres dentro del espacio de nombres anónimo :
#include <iostream>
using namespace std;
namespace
{
namespace inner
{
int cout = 42;
}
}
int main()
{
cout << inner::cout << endl;
return 0;
}
Solo renombra la función de espacio de nombres local.
Usted no puede El estándar contiene la siguiente sección ( §7.3.1.1 , C ++ 03):
Una definición de espacio de nombres sin nombre se comporta como si fuera reemplazada por
namespace unique { /* empty body */ }
using namespace unique;
namespace unique { namespace-body }
donde todas las apariciones de elementos únicos en una unidad de traducción se reemplazan por el mismo identificador y este identificador difiere de todos los demás identificadores en todo el programa.
Por lo tanto, no tiene forma de referirse a ese nombre único.
Sin embargo, técnicamente podrías usar algo como lo siguiente:
int i;
namespace helper {
namespace {
int i;
int j;
}
}
using namespace helper;
void f() {
j++; // works
i++; // still ambigous
::i++; // access to global namespace
helper::i++; // access to unnamed namespace
}