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

6

我在默认/"root"命名空间中定义了两个命名空间,nsAnsBnsA有一个子命名空间nsA::subA。当我试图从nsA::subA内部引用属于nsB的函数时,我会遇到错误:

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

有什么想法吗?

3个回答

9

使用全局作用域解析:

::nsB::TheFunctionInNsB()

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
需要更多信息来解释那个错误。以下代码没有问题:
#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(...),则会收到您引用的错误。您可能在namespace subA内部#include了nsB的头文件吗?

你可能是不是在subA命名空间中包含了nsB的头文件? -- 的确,我是这样做的。非常好的发现和解释。 - mph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接