2009-03-08 9 views
17

Có một cách gọn gàng hơn để xác định một lớp trong một namespace hơn thế này:Định nghĩa một lớp trong một namespace

namespace ns { class A {}; } 

Tôi đã hy vọng một cái gì đó giống như class ns::A {}; sẽ làm việc, nhưng than ôi không.

Trả lời

32

Bạn đang gần, bạn có thể chuyển tiếp khai báo lớp trong không gian tên và sau đó xác định nó ở bên ngoài nếu bạn muốn:

namespace ns { 
    class A; // just tell the compiler to expect a class def 
} 

class ns::A { 
    // define here 
}; 

Những gì bạn không thể làm là xác định các lớp trong không gian tên mà không thành viên và sau đó xác định lớp một lần nữa bên ngoài không gian tên. Điều đó vi phạm Quy tắc Một Định nghĩa (hoặc là vô nghĩa).

+0

cảm ơn. điều đó không gọn gàng hơn nhưng có vẻ hợp lý. –

+1

Tôi không nghĩ rằng thực sự có một phiên bản ngắn gọn hoặc dễ đọc hơn 'namespace ns {class A {}; } 'nhưng nó có lẽ chỉ là ý kiến ​​cá nhân. –

+0

Đó là sự tách biệt khai báo và định nghĩa. – Shaowu

0

Không, bạn không thể. Để báo chuẩn C++, phần 3.3.5:

Một tên tuyên bố bên ngoài tất cả các tên hoặc không gian tên vô danh (7,3), khối (6.3), vui vẻ (8.3.5), chức năng định nghĩa (8.4) và các lớp (khoản 9) có phạm vi không gian tên toàn cầu

Vì vậy, khai báo phải nằm trong khối không gian tên - định nghĩa tất nhiên có thể nằm ngoài nó.

+0

tốt, class A {}; là một định nghĩa, không phải là một tuyên bố. Bạn có chắc là báo giá có thể áp dụng được không? Định nghĩa –

+0

là các khai báo –

+0

um không được suy nghĩ kỹ - nhưng tôi chắc chắn rằng báo giá sẽ áp dụng - tôi sẽ xem xét lại. –

2

Phần bạn nên đọc là thế này:

7.3.1.2 định nghĩa thành viên Namespace

3 Mọi tên đầu tiên tuyên bố trong một không gian tên là thành viên của không gian tên mà [.... ]

Lưu ý cụm từ - khai báo để D.Shawley (và ví dụ của anh ấy) là chính xác.

7

Bạn có thể làm điều đó, nhưng nó không thực sự thành công hơn.

namespace ns { 
    class A; 
} 

class ns::A { 
}; 

Hoặc

namespace ns { 
    class B; 
} 

using ns::B; 
class B { 
};