Tôi đang làm việc trên một dự án rất lớn và trong một tập tin tất cả chúng ta đột nhiên có một lỗi biên dịch thời gian mà trình biên dịch dường như nghĩ rằng cuộc gọi của chúng tôi để winsock.h bind()
thực sự là một cuộc gọi đến std::bind()
. Có vẻ như ở đâu đó trong tệp bao gồm có đoạn mã using namespace std
. Chúng tôi có thể thử và tìm thấy những nơi này using namespace std
được sử dụng và loại bỏ chúng, nhưng có lẽ có một cách tốt hơn để làm điều này?std :: bind và winsock.h ràng buộc sự nhầm lẫn
Trả lời
Bạn có thể thay đổi cuộc gọi của mình để sử dụng ::bind()
để chỉ định không gian tên chung.
Vâng, điều này thật không may. Như tôi đã trình bày ở http://gcc.gnu.org/ml/libstdc++/2011-03/msg00143.html các std::bind
mẫu là một trận đấu tốt hơn, trừ khi bạn sử dụng chính xác các loại đối số phải:
Vấn đề là các ổ cắm bind() chức năng có chữ ký này:
int bind(int, const sockaddr*, socklen_t);
nên gọi trong ví dụ bằng cách sử dụng một con trỏ không const thấy rằng variadic template std :: bind là một kết hợp tốt hơn. Điều tương tự cũng sẽ xảy ra nếu đối số thứ ba là bất kỳ loại tích phân nào ngoại trừ socklen_t.
Mã của bạn sẽ làm việc với GCC vì tôi đã thêm một phần mở rộng phù hợp với GCC của std::bind
để ngăn chặn sự nhập nhằng này, bằng cách loại bỏ std::bind
từ sự quá tải thiết lập nếu đối số đầu tiên là "ổ cắm giống như", mà tôi định nghĩa sử dụng is_integral
và is_enum
. Tuy nhiên, điều đó không có tác dụng với các triển khai khác.
Loại bỏ các using namespace std;
là một ý tưởng tốt dù sao, nhưng có thể không hoàn toàn đầy đủ, bởi vì một cuộc gọi không đủ tiêu chuẩn để bind()
điều đó xảy ra để sử dụng một loại quy định tại namespace std
(như std::size_t
) vẫn có thể tìm thấy std::bind
bởi lập luận tra cứu phụ thuộc. Câu trả lời của Jonathan Potter là cách tốt nhất để đảm bảo bạn có được đúng chức năng: hội đủ điều kiện là ::bind
.
+ 1 để giải thích lý do. –
không gian tên thú vị phải không? –
Không, chỉ cần xóa nó. – inf
Xóa 'sử dụng không gian tên std', nếu không bạn sẽ gặp vấn đề tương tự đôi khi trong tương lai với một số tên khác. – juanchopanza