Comment référencer un espace de noms C ++ externe à partir d'un espace imbriqué?

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

  •  03-07-2019
  •  | 
  •  

Question

J'ai deux espaces de noms définis dans le répertoire / "racine" par défaut. espace de noms, nsA et nsB . nsA a un sous-espace de noms, nsA :: subA . Lorsque j'essaie de référencer une fonction appartenant à nsB , depuis l'intérieur de nsA :: subA , un message d'erreur s'affiche:

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

Des idées?

Était-ce utile?

La solution

Besoin de plus d’informations pour expliquer cette erreur. Le code suivant est correct:

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

Ainsi, bien que la spécification de l’espace de noms global résolve votre problème actuel, il est généralement possible de faire référence aux symboles dans nsB sans lui. Sinon, vous devriez écrire :: std :: cout, :: std :: string, etc. chaque fois que vous vous trouvez dans une autre portée d'espace de noms. Et vous pas. QED.

La spécification de l'espace de noms global s'applique aux situations dans lesquelles un autre nsB est visible dans la portée actuelle - par exemple, si nsA :: subA contenait son propre espace de nommage ou classe appelée nsB et que vous souhaitez appeler: nsbB: foo plutôt que nsA: : subA :: nsB :: foo. Ainsi, vous obtiendrez l'erreur que vous citez si, par exemple, vous avez déclaré (mais pas défini) nsA :: subA :: nsB :: theFunctionInNsB (...). Avez-vous peut-être #incluez l’en-tête de nsB depuis l’espace de noms subA?

Autres conseils

Utiliser la résolution globale de l'étendue:

::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;
}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top