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

问题

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

<span style="color:#444444"><span style="background-color:#ffffff"><code class="language-cpp">undefined reference to `nsA::subA::nsB::theFunctionInNsB(...)'</code></span></span>

解决方案

 

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

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-cpp">#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();
}
</code></span></span>

因此,虽然指定全局命名空间可以解决您当前的问题,但通常可以在没有它的情况下引用 nsB 中的符号。否则,每当您在另一个命名空间范围内时,您都必须编写 ::std::cout、::std::string 等。而你没有。

指定全局命名空间适用于在当前范围内有另一个 nsB 可见的情况 – 例如,如果 nsA::subA 包含自己的命名空间或名为 nsB 的类,并且您想调用 ::nsbB:foo 而不是 nsA::subA: :nsB::foo。因此,如果您已经声明(但未定义)nsA::subA::nsB::theFunctionInNsB(…),您会得到引用的错误。您是否可能从命名空间 subA 中 #include nsB 的标头?

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-cpp">#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;
}</code></span></span>

使用全局范围解析:

<span style="color:#333333"><span style="background-color:#ffffff"><code class="language-php">::nsB::TheFunctionInNsB()</code></span></span>

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值