2010-03-19 31 views
15

Nếu tôi có một số toán tử dòng quá tải, được định nghĩa cho các đối tượng thư viện cục bộ, thì có ổn không khi chúng đi đến không gian tên std? Nếu tôi không khai báo chúng trong không gian tên std, thì tôi phải sử dụng using ns:: operator <<.Toán tử << (luồng) nào không gian tên nào đến?

Là câu hỏi tiếp theo có thể, có bất kỳ toán tử nào phải đi tới không gian tên chuẩn hoặc toàn cục không?

Trả lời

24

Theo Koenig Lookup (C++ Standard 3.4.2) operator<< sẽ được tìm kiếm trong không gian tên của đối số. Không cần khai báo nó trong không gian tên std.

+0

vì vậy, nếu tôi có đối tượng/lớp từ thư viện C bên ngoài trong không gian tên chung, tôi có nên khai báo toán tử trong không gian tên chung không? – Anycorn

+0

Tôi nghĩ rằng bạn nên khai báo toán tử trong không gian tên nơi đối số của nó. –

2

Thông thường, việc khai báo bất kỳ thứ gì (loại, toán tử, v.v ...) là một phần của không gian tên bạn không sở hữu. Điều này có thể gây ra những hậu quả không mong muốn cho những người sử dụng thư viện của bạn. Một giải pháp tốt hơn là xác định không gian tên của riêng bạn và nhập cả std và không gian tên của bạn khi bạn cần kết hợp các giải pháp.

7

Tiêu chuẩn C++ cấm bạn khai báo các cấu trúc của riêng bạn trong không gian tên std.

+1

std :: swap là một ngoại lệ đáng chú ý. Bạn đặc biệt được phép cung cấp chuyên môn mẫu của std :: swap, mà phải nằm trong không gian tên std –

+5

'std :: swap' cũng không ngoại lệ. Bạn có thể cung cấp các chuyên môn cho bất kỳ mẫu thư viện chuẩn nào. –

21

operator<<(..., MyClass) nên đi trong cùng một không gian tên như MyClass. Bạn nên nghĩ về nó như là một phần của giao diện của MyClass, mặc dù nó xảy ra (nhất thiết) là một hàm không phải thành viên.

Một vài tài liệu tham khảo:

+0

Ngoại lệ đối với quy tắc đặt tất cả những thứ có liên quan vào một không gian tên là các chuyên môn từng phần liên quan đến MyClass, ví dụ: đối với std :: hash, std :: less, std :: swap, v.v. đi vào :: std ::. – metal

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