如何从嵌套的C ++命名空间中引用外部C ++命名空间?

时间:2009-04-29 17:50:56

标签: c++ gcc namespaces

我在默认/“root”命名空间中定义了两个命名空间, nsA nsB nsA 有一个子命名空间, nsA :: subA 。当我尝试从 nsA :: subA 内部引用属于 nsB 的函数时,出现错误:

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

有什么想法吗?

3 个答案:

答案 0 :(得分:7)

使用全局范围解析:

::nsB::TheFunctionInNsB()

答案 1 :(得分:5)

#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 :(得分:2)

需要更多信息来解释该错误。以下代码很好:

#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(...),那么您将得到引用的错误。您是否可以从命名空间subA内部#include nsB的标头?