2009-04-29 42 views
5

Tôi có hai không gian tên được xác định trong không gian tên mặc định/"gốc", nsAnsB. nsA có một không gian tên phụ, nsA :: subA. Khi tôi cố gắng tham khảo một hàm thuộc về NSB, từ bên trong NSA :: Suba, tôi nhận được một lỗi:Làm cách nào để tham chiếu một vùng tên C++ bên ngoài từ bên trong một vùng lồng nhau?

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

Bất kỳ ý tưởng?

Trả lời

2

Cần biết thêm thông tin để giải thích lỗi đó. Mã sau đây là tốt:

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

Vì vậy, trong khi xác định không gian tên chung giải quyết vấn đề hiện tại của bạn, nói chung có thể tham khảo biểu tượng trong nsB mà không có nó. Nếu không, bạn phải viết :: std :: cout, :: std :: string, vv, bất cứ khi nào bạn đang ở trong một phạm vi không gian tên khác. Và bạn không. QED.

Chỉ định không gian tên chung là dành cho các tình huống có nsB khác hiển thị trong phạm vi hiện tại - ví dụ: nếu nsA :: subA chứa không gian tên hoặc lớp riêng của nó được gọi là nsB và bạn muốn gọi :: nsbB: foo thay vì nsA :: subA :: nsB :: foo. Vì vậy, bạn sẽ nhận được lỗi mà bạn trích dẫn nếu ví dụ bạn đã khai báo (nhưng không được định nghĩa) nsA :: subA :: nsB :: theFunctionInNsB (...). Bạn có thể #include tiêu đề cho nsB từ bên trong không gian tên subA?

+0

"Bạn có thể # bao gồm tiêu đề cho nsB từ bên trong không gian tên subA?" - thực sự, tôi đã có. Great bắt, và giải thích tốt. – mikeh

7

Sử dụng độ phân giải phạm vi toàn cầu:

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

Cảm ơn Michael - cả hai đều trả lời câu hỏi của tôi một cách hoàn hảo, jeffamaphone đã nhận nó trước tiên vì vậy tôi sẽ cho anh ta tấm séc. Hình minh họa của bạn sẽ tốt cho những người lướt web trong tương lai. – mikeh

+0

+1 để cung cấp mẫu mã. Điều đó làm cho câu trả lời rõ ràng hơn –

Các vấn đề liên quan