Как мне ссылаться на внешнее пространство имен C ++ из вложенного? - PullRequest
5 голосов
/ 29 апреля 2009

У меня есть два пространства имен, определенных в пространстве имен по умолчанию / "root", nsA и nsB . nsA имеет подпространство имен, nsA :: subA . Когда я пытаюсь сослаться на функцию, которая принадлежит nsB , изнутри nsA :: subA , я получаю сообщение об ошибке:

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

Есть идеи?

Ответы [ 3 ]

7 голосов
/ 29 апреля 2009

Использовать глобальное разрешение области:

::nsB::TheFunctionInNsB()
5 голосов
/ 29 апреля 2009
#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;
}
2 голосов
/ 30 апреля 2009

Нужна дополнительная информация, чтобы объяснить эту ошибку. Следующий код в порядке:

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

Таким образом, хотя указание глобального пространства имен решает вашу текущую проблему, в целом можно ссылаться на символы в nsB без него. В противном случае вам придется писать :: std :: cout, :: std :: string и т. Д. Всякий раз, когда вы находитесь в другой области имен. А ты нет. QED.

Указание глобального пространства имен предназначено для ситуаций, когда в текущей области виден другой nsB - например, если nsA :: subA содержал собственное пространство имен или класс с именем nsB, и вы хотите вызвать :: nsbB: foo, а не nsA: : Суб :: NSB :: Foo. Таким образом, вы получите ошибку, которую вы цитируете, если, например, вы объявили (но не определили) nsA :: subA :: nsB :: theFunctionInNsB (...). Возможно, вы #include заголовка для nsB изнутри пространства имен subA?

...