كيف يمكنني مرجع خارجي C++ مساحة من داخل المتداخلة ؟

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

  •  03-07-2019
  •  | 
  •  

سؤال

لدي اثنين من مساحات محددة في الافتراضي/"الجذر" مساحة الاسم ، وكالة الأمن القومي و nsB. وكالة الأمن القومي وقد فرعي مساحة الاسم ، الأمن القومي::سوبا.عندما أحاول الرجوع إلى الوظيفة التي ينتمي إليها nsB, من داخل الأمن القومي::سوبا, أنا على خطأ:

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();
}

لذلك ، في حين تحدد مساحة العالمي يحل المشكلة الحالية الخاصة بك ، بشكل عام من الممكن أن تشير إلى رموز في جهاز الأمن القومي دون ذلك.وإلا يجب عليك أن تكتب ::std::cout, ::std::string, الخ, كلما كنت في آخر مساحة اسم النطاق.و أنت لا.وهو المطلوب.

تحديد مساحة العالمي هو الحالات التي يكون فيها هناك جهاز الأمن القومي واضحة في النطاق الحالي - على سبيل المثال إذا nsA::سوبا الوارد الخاصة به مساحة أو فئة ما يسمى جهاز الأمن القومي ، كنت ترغب في الاتصال ::nsbB:فو بدلا من الأمن القومي::سوبا::nsB::فو.إذا كنت تحصل على خطأ الاقتباس على سبيل المثال إذا كنت قد أعلنت (ولكن لم يتم تعريف) nsA::سوبا::nsB::theFunctionInNsB(...).هل ربما تتضمن #رأس جهاز الأمن القومي من داخل مساحة سوبا?

نصائح أخرى

استخدام النطاق العالمي القرار:

::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