Pergunta

Eu tenho dois namespaces definidos no namespace padrão/"root", nsA e nsB. nsA tem um sub-namespace, nsA::subA.Quando tento referenciar uma função que pertence a nsB, de dentro de nsA::subA, recebo um erro:

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

Alguma ideia?

Foi útil?

Solução

Precisa de mais informações para explicar esse erro.O código a seguir está bom:

#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();
}

Portanto, embora a especificação do namespace global resolva seu problema atual, em geral é possível referir-se a símbolos em nsB sem ele.Caso contrário, você teria que escrever ::std::cout, ::std::string, etc, sempre que estivesse em outro escopo de namespace.E você não.QED.

A especificação do namespace global é para situações em que há outro nsB visível no escopo atual - por exemplo, se nsA::subA contivesse seu próprio namespace ou classe chamada nsB e você deseja chamar ::nsbB:foo em vez de nsA::subA: :nsB::foo.Portanto, você obteria o erro citado se, por exemplo, tivesse declarado (mas não definido) nsA::subA::nsB::theFunctionInNsB(...).Você talvez #incluiu o cabeçalho para nsB de dentro do namespace subA?

Outras dicas

Use resolução de escopo 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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top