Khi tôi viết đoạn mã sau nó được biên soạn và thực hiện đúng cách:Tại sao sử dụng chỉ thị hoạt động khác nhau trong phạm vi toàn cầu và phạm vi địa phương?
#include <iostream>
using namespace std;
namespace first
{
int x = 5;
int y = 10;
}
namespace second
{
double x = 3.1416;
double y = 2.7183;
}
int main() {
using namespace first; //using derective
using second::y;
cout << x << endl;
cout << y << endl;
return 0;
}
Nhưng nếu tôi viết sử dụng chỉ thị bên ngoài chức năng chính như sau,
using namespace first; //using derective
using second::y;
int main() {
cout << x << endl;
cout << y << endl;
return 0;
}
Nó cho lỗi biên dịch này:
g++ namespace03.cpp -o namespace03
namespace03.cpp: In function ‘int main()’:
namespace03.cpp:20:11: error: reference to ‘y’ is ambiguous
namespace03.cpp:13:10: error: candidates are: double second::y
namespace03.cpp:7:7: error: int first::y
make: *** [namespace03] Error 1
Ai đó có thể giải thích lý do tại sao sử dụng chỉ thị hoạt động khác khi được sử dụng bên trong main
và bên ngoài main
?
Cảm ơn Jesse đã trả lời nhanh ... Xin hãy sửa tôi nếu tôi sai ... Nhưng khi sử dụng chỉ thị có chức năng chính thì sẽ có 2 khai báo y. Nếu vậy tại sao trình biên dịch cho vấn đề trong trường hợp thứ hai chỉ? – Amrit
@ user2235938: Có hai khai báo 'y', nhưng khai báo sử dụng khai báo' second :: y' bên trong chính, trong khi 'first :: y' được khai báo trong phạm vi không gian tên chung. Vì 'second :: y' được khai báo bên trong chính, nó ẩn' first :: y'. Bạn có quen với việc giấu tên không? –
Xin lỗi Jesse ... Nhưng tôi không thể hiểu được. khi cả hai câu lệnh "sử dụng không gian tên trước tiên; sử dụng giây :: y;" nằm bên trong hàm main, nó sẽ khai báo cả hai :: y và second :: y trong phạm vi cục bộ và cung cấp lỗi biên dịch. Nhưng nó không và chương trình biên dịch và chạy thành công. Và khi cả hai câu lệnh đều nằm ngoài chính, nó thậm chí không được biên dịch do sự mơ hồ. Vui lòng giải thích ... – Amrit