Come faccio a fare riferimento a uno spazio dei nomi C ++ esterno da uno nidificato?

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

  •  03-07-2019
  •  | 
  •  

Domanda

Ho due spazi dei nomi definiti in default / " root " spazio dei nomi, nsA e nsB . nsA ha uno spazio dei nomi secondari, nsA :: subA . Quando provo a fare riferimento a una funzione che appartiene a nsB , dall'interno di nsA :: subA , viene visualizzato un errore:

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

Qualche idea?

È stato utile?

Soluzione

Hai bisogno di maggiori informazioni per spiegare quell'errore. Il seguente codice va bene:

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

Quindi, mentre si specifica lo spazio dei nomi globale risolve il problema attuale, in generale è possibile fare riferimento ai simboli in nsB senza di essa. Altrimenti, dovresti scrivere :: std :: cout, :: std :: string, ecc, ogni volta che ti trovavi in ??un altro ambito dello spazio dei nomi. E tu no. QED.

Specificare lo spazio dei nomi globale è per le situazioni in cui è visibile un altro nsB nell'ambito corrente, ad esempio se nsA :: subA conteneva il proprio spazio dei nomi o classe chiamata nsB e si desidera chiamare :: nsbB: foo anziché nsA: : subA :: :: NSB foo. Quindi otterrai l'errore citato se, ad esempio, hai dichiarato (ma non definito) nsA :: subA :: nsB :: theFunctionInNsB (...). Hai forse #incluso l'intestazione per nsB all'interno dello spazio dei nomi subA?

Altri suggerimenti

Usa la risoluzione globale dell'ambito:

::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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top