2009-04-29 22 views

cevap

2

o hatayı açıklamak Daha fazla bilgi gerekiyor. Aşağıdaki kod gayet: Yani

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

, küresel ad alanını geçerli sorunu çözer iken, genel olarak onsuz NSB sembollere başvurmak mümkündür. Aksi takdirde, başka bir isim-alanı kapsamında olduğunuzda, :: std :: cout, :: std :: string, vb. Ve sen yapmıyorsun. QED.

Genel ad boşluğunun belirtilmesi, geçerli kapsamda başka bir nsB'nin görülebileceği durumlar içindir - örneğin, nsA :: subA, kendi ad alanını veya nsB adlı sınıfı içeriyorsa, ve şunu aramak istersiniz: nsBB: fons yerine nsA :: Suba :: NSB :: foo. Yani, örneğin, (ancak tanımlanmamış) nsA :: subA :: nsB :: theFunctionInNsB (...) bildirdiyseniz, teklif verdiğiniz hatayı alırsınız. NsB için alt alan adının içinden #include girebilir miydiniz?

+0

"İç ad alanı alt ağından nsB için başlığa sahip olabilir misiniz?" - Gerçekten de vardı. Harika yakalama ve iyi bir açıklama. – mikeh

7

Kullanım küresel kapsamı çözünürlüğü:

::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; 
} 
+0

Teşekkürler Michael - her ikisi de soruyu mükemmel bir şekilde cevapladığında, jeffamaphone önce onu aldım, bu yüzden ona çeki vereceğim. Gelecekte sörfçüler için burada olmanız iyi olacaktır. Bir kod örneği vermek için – mikeh

+0

+1. Bu, cevabı daha net bir hale getirdi –

İlgili konular