¿Cómo hago referencia a un espacio de nombres C ++ externo desde uno anidado?

StackOverflow https://stackoverflow.com/questions/803506

  •  03-07-2019
  •  | 
  •  

Pregunta

Tengo dos espacios de nombres definidos en la raíz predeterminada / " raíz " espacio de nombres, nsA y nsB . nsA tiene un espacio de nombres, nsA :: subA . Cuando intento hacer referencia a una función que pertenece a nsB , desde dentro de nsA :: subA , aparece un error:

undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'

¿Alguna idea?

¿Fue útil?

Solución

Necesito más información para explicar ese error. El siguiente código está bien:

#include <iostream>

namespace nsB {
    void foo() { std::cout << "nsB\n";}
}

namespace nsA {
    void foo() { std::cout << "nsA\n";}
    namespace subA {
        void foo() { std::cout << "nsA::subA\n";}
        void bar() {
            nsB::foo();
        }
    }
}

int main() {
    nsA::subA::bar();
}

Por lo tanto, si bien la especificación del espacio de nombres global resuelve su problema actual, en general es posible referirse a los símbolos en nsB sin él. De lo contrario, tendría que escribir :: std :: cout, :: std :: string, etc., cuando estuviera en otro ámbito de espacio de nombres. Y tu no QED.

La especificación del espacio de nombres global es para situaciones donde hay otro nsB visible en el ámbito actual, por ejemplo, si nsA :: subA contenía su propio espacio de nombres o clase llamada nsB, y desea llamar a :: nsbB: foo en lugar de nsA: : subA :: nsB :: foo. Entonces obtendrá el error que cita si, por ejemplo, ha declarado (pero no definido) nsA :: subA :: nsB :: theFunctionInNsB (...). ¿Tal vez has incluido # el encabezado de nsB dentro del espacio de nombres subA?

Otros consejos

Utilice la resolución de alcance global:

::nsB::TheFunctionInNsB()
#include <stdio.h>

namespace nsB {
    void foo() {
        printf( "nsB::foo()\n");
    }
}

namespace nsA {
    void foo() {
        printf( "nsA::foo()\n");
    }

    namespace subA {
        void foo() {
            printf( "nsA::subA::foo()\n");
            printf( "calling nsB::foo()\n");

            ::nsB::foo();      // <---  calling foo() in namespace 'nsB'
        }
    }
}

int main()
{
    nsA::subA::foo();

    return 0;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top