2011-10-09 40 views
6
namespace MyNamespace 
{ 
    static void foo1() 
    { 

    } 
} 

using namespace MyNamespace; 

class MyClass 
{ 
    void foo2() 
    { 
     ::foo1(); 
    }  
}; 

Thao tác giải quyết phạm vi :: có nghĩa là sử dụng phương pháp trong không gian tên chung. Ở đây chúng ta có thể sử dụng ::foo1(). Điều này có nghĩa là phương pháp foo1() nằm trong không gian tên chung, tôi có đúng không?C++ sử dụng câu lệnh không gian tên

Câu hỏi của tôi là, using namespace ANAMESPACE_NAME có nghĩa là chúng tôi nhập tất cả các phần tử tạo thành không gian tên ANAMESPACE_NAME vào không gian tên chung?

Trả lời

3

Mục 3.4.3.4 của chuẩn C++ 2003 có một câu trả lời:

Một tên bắt đầu bằng toán tử phạm vi :: unary (5.1) được tra cứu trong một phạm vi toàn cầu, trong đơn vị dịch mà nó được sử dụng trong phạm vi toàn cầu. Tên phải là được khai báo trong phạm vi không gian tên toàn cầu hoặc phải là tên có tuyên bố hiển thị trong phạm vi toàn cầu do sử dụng chỉ thị (3.4.3.2).

Đoạn này gần như giống hệt trong C++ 11 FDIS, vì vậy điều này cũng có thể chứa trong C++ 11.

3

Ở đây chúng tôi có thể sử dụng :: foo1(). Điều này có nghĩa là phương thức foo1() nằm trong không gian tên chung, tôi có đúng không?

Đúng vậy. Nó có nghĩa là gọi phương thức có tên là foo1() được định nghĩa trong không gian tên chung. Điều này được gọi là Tra cứu không gian tên đủ điều kiện.

làm "sử dụng không gian tên ANAMESPACE_NAME" nghĩa là chúng tôi nhập tất cả các phần tử trong không gian tên ANAMESPACE_NAME vào không gian tên chung?

Có, nó nhập tất cả các phần tử từ không gian tên ANAMESPACE_NAME vào không gian tên hiện tại.
Nó được gọi là sử dụng chỉ thị.
Nếu bạn chỉ muốn nhập phần tử cụ thể trong sử dụng loại hiện tại, sử dụng tờ khai.

định dạng là:

sử dụng ANAMESPACE_NAME :: ELEMENT_NAME;

5

Không. "Sử dụng không gian tên ANAMESPACE_NAME" nghĩa là chúng tôi nhập tất cả các phần tử vào phạm vi hiện tại.

Bạn có thể viết một cái gì đó như thế này:

namespace A { 
    int i = 10, j = 20; 
} 

int f() 
{ 
    using namespace A; // injects names from A into the global scope. 
    return i * j;  // uses i and j from namespace A. 
} 

int k = i * j; // Error: undefined variant i and j. 
+0

+1: Sử dụng-chỉ thị không phải lúc nào phải trong phạm vi toàn cầu. –

+0

+1: Tương tự như trên. –

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