代码之家  ›  专栏  ›  技术社区  ›  mph

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

  •  5
  • mph  · 技术社区  · 16 年前

    我在默认的/“根”名称空间中定义了两个名称空间, 国家安全局 国家安全局 . 国家安全局 具有子命名空间, 国家安全局:亚 . 当我尝试引用属于 国家安全局 ,从内部 国家安全局:亚 ,我得到一个错误:

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

    有什么想法吗?

    3 回复  |  直到 16 年前
        1
  •  2
  •   Steve Jessop    16 年前

    需要更多信息来解释这个错误。以下代码正常:

    #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::SubA::NSB::Foo。因此,如果您已经声明(但未定义)nsa::suba::nsb::thefunctioninnsb(…),您将得到引用的错误。您是否可能包括命名空间suba内的nsb头?

        2
  •  7
  •   i_am_jorf    16 年前

    使用全局范围解析:

    ::nsB::TheFunctionInNsB()
    
        3
  •  5
  •   Michael Burr    16 年前
    #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;
    }