2008-10-05 27 views
27

Khi tạo thư viện trong một không gian tên cụ thể, thường thuận tiện để cung cấp các toán tử quá tải cho các lớp trong không gian tên đó. Dường như (ít nhất là với g ++) mà các nhà khai thác quá tải có thể được thực hiện hoặc trong không gian tên của thư viện:Không gian tên và nhà khai thác quá tải trong C++

namespace Lib { 
class A { 
}; 

A operator+(const A&, const A&); 
} // namespace Lib 

hoặc không gian tên toàn cầu

namespace Lib { 
class A { 
}; 
} // namespace Lib 

Lib::A operator+(const Lib::A&, const Lib::A&); 

Từ thử nghiệm của tôi, cả hai đều có vẻ làm việc tốt. Có sự khác biệt thực tế nào giữa hai lựa chọn này không? Là một trong hai cách tiếp cận tốt hơn?

Trả lời

29

Bạn nên xác định chúng trong không gian tên thư viện. Trình biên dịch sẽ tìm thấy chúng bằng cách sử dụng tra cứu phụ thuộc đối số.

Không cần phải gây ô nhiễm không gian tên chung.

+4

Một lý do khác để sử dụng không gian tên thư viện: [bài đăng này] (http://stackoverflow.com/questions/5195512/namespaces-and-operator-resolution) chứa ví dụ về việc sử dụng không gian tên chung không hoạt động. – Tim

2

Bạn nên xác định nó trong không gian tên, bởi vì cú pháp sẽ ít tiết hơn và không làm lộn xộn không gian tên chung.

Trên thực tế, nếu bạn xác định quá tải của bạn trong định nghĩa lớp học của bạn, điều này trở thành một câu hỏi tranh luận:

namespace Lib { 

class A { 
public: 
    A operator+(const A&); 
}; 

} // namespace Lib 
+1

Điều này có thể là một ý tưởng tồi, vì nó có nghĩa là nếu B có thể được chuyển đổi hoàn toàn thành A nhưng không phải là phân lớp của A, thì A + B hoạt động, nhưng B + A không gây nhầm lẫn. Tất nhiên điều đó không nhất thiết phải quan trọng, ví dụ, nếu kiểu nhà của bạn cấm chuyển đổi ngầm định giữa các kiểu do người dùng định nghĩa. –

+1

Tôi đồng ý: Có vấn đề là A + B hoạt động, nhưng không phải B + A (giả sử A là một lớp mô phỏng một số phức và B là int). Một vấn đề khác là một toán tử non-friend + function tăng sự đóng gói của lớp, trong khi phương thức lớp giảm nó. – paercebal

15

Đưa nó vào không gian tên thư viện làm việc vì Koenig lookup.

+1

Thực tế, việc tra cứu Koeing đã được tạo ra chính xác để bạn có thể đặt hàm bên trong không gian tên Lib, và vẫn có quá tải. Xem Các mục C++ đặc biệt 31-32. – tenpn

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