Как ссылаться на внешнее пространство имен C++ изнутри вложенного?

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

  •  03-07-2019
  •  | 
  •  

Вопрос

У меня есть два пространства имен, определенные в пространстве имен по умолчанию/корневом: НСА и нсБ. НСА имеет подпространство имен, нсА::субА.Когда я пытаюсь сослаться на функцию, принадлежащую нсБ, изнутри нсА::субА, я получаю сообщение об ошибке:

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

Есть идеи?

Это было полезно?

Решение

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

#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 и т. д. всякий раз, когда вы находились в другой области пространства имен.А ты нет.КЭД.

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

Другие советы

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

::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;
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top