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?
Nguồn
2009-04-30 12:05:54
"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