2012-04-05 29 views
9

Tôi đang sử dụng thư viện libcxx mới và tôi có một mã gọi hàm socket bind(). Vấn đề là khi tôi gõ using namespace std; trình biên dịch mang lại cho tôi một lỗi cho đoạn mã sau:Biên dịch mã sử dụng hàm bind() với libcxx không thành công

int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 

Lỗi sử dụng kêu vang (svn xây dựng):

error: no viable conversion from '__bind<int &, sockaddr *, unsigned long>' to 'int' 
int res = bind(sockfd, (struct sockaddr *)&myAddr, sizeof(myAddr)); 

Tôi nghĩ rằng vấn đề là using namespace std; mang hàm std::bind() từ tiêu đề <functional> đến phạm vi (mặc dù tiêu đề không được bao gồm). Vì tôi đang sử dụng thư viện của bên thứ ba sử dụng toàn bộ không gian tên nên tôi không thể dễ dàng thay đổi tên lớp thành tên đủ điều kiện.

Tôi đã tự hỏi liệu đây có phải là vấn đề trong việc triển khai thư viện hay không hoặc có một số quy tắc mới trong C++ 11 có khả năng phá vỡ mã cũ sử dụng bind() hay không. Bất kỳ suy nghĩ về điều này sẽ được đánh giá cao.

Cảm ơn

La Mã

+0

Bạn có ý gì khi nói rằng thư viện của bên thứ ba sử dụng toàn bộ không gian tên? – Troubadour

+0

Tôi có nghĩa là nó có 'sử dụng không gian tên std;' trong một số tệp. –

+0

Có lẽ chỉ trong các tệp nguồn chứ không phải trong tiêu đề? Điều đó không ảnh hưởng đến bạn chút nào. – Troubadour

Trả lời

27

Đây không phải là một vấn đề trong việc thực hiện các thư viện. C++ 11 đã giới thiệu chức năng std::bind của riêng mình vào namespace std, được sử dụng để liên kết các tham số với các chức năng và hỗ trợ một chút chương trình bậc cao hơn.

Lý do để có namespace std là để giúp ngăn các hàm và lớp thư viện mới gây ra các thay đổi đột phá trong mã hiện có. Lý do cho điều này là tất cả mọi thứ có một tên bắt đầu với std::, ngăn chặn va chạm tên.

Tuy nhiên, nếu bạn viết using namespace std; trong chương trình của bạn, bạn đang phơi bày bản thân để thay đổi vi phạm tiềm năng như thế này, kể từ khi chức năng miễn phí bind và chức năng std::bind có thể không nhất thiết phải disambiguated.

Để khắc phục điều này, bạn có thể gọi bind làm ::bind để làm rõ rằng nó nằm trong không gian tên chung hoặc bạn có thể xóa using namespace std; ở đầu chương trình.

Hy vọng điều này sẽ hữu ích!

+0

Cảm ơn rất nhiều .. nó hoạt động tuyệt vời !! – RajibTheKing

+1

Cuối cùng tôi hiểu những gì đang xảy ra với ràng buộc không trả về int. – viktike

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