2011-07-12 29 views
5

Tại sao điều này?C++ tên nhầm lẫn không gian - std :: vs :: vs no prefix on a call to tolower?

transform(theWord.begin(), theWord.end(), theWord.begin(), std::tolower); - không hoạt động transform(theWord.begin(), theWord.end(), theWord.begin(), tolower); - không hoạt động

nhưng

transform(theWord.begin(), theWord.end(), theWord.begin(), ::tolower); - không làm việc

theWord là một chuỗi. Tôi là using namespace std;

Tại sao nó hoạt động với tiền tố :: và không phải với số std:: hoặc không có gì?

cảm ơn sự giúp đỡ của bạn.

+0

Bạn đang bao gồm những tệp tiêu đề nào? –

+0

'#include #include #include #include #include #include #include ' – user839913

Trả lời

16

using namespace std; hướng dẫn trình biên dịch tìm kiếm các tên chưa được đặt trước (ví dụ: những người không có :: s) trong std cũng như không gian tên gốc. Bây giờ, tolower bạn đang xem là một phần của thư viện C và do đó trong không gian tên gốc, luôn nằm trên đường dẫn tìm kiếm, nhưng cũng có thể được tham chiếu rõ ràng với ::tolower.

Tuy nhiên, cũng có một số std::tolower, có hai tham số. Khi bạn có using namespace std; và cố gắng sử dụng tolower, trình biên dịch không biết ý bạn là gì và do đó, nó sẽ trở thành lỗi.

Vì vậy, bạn cần sử dụng ::tolower để chỉ định bạn muốn một trong không gian tên gốc.

Điều này, ngẫu nhiên, là một ví dụ tại sao using namespace std; có thể là một ý tưởng tồi. Có đủ công cụ ngẫu nhiên trong std (và C++ 0x thêm nhiều hơn nữa!) Có khả năng là các xung đột tên có thể xảy ra. Tôi khuyên bạn không nên sử dụng using namespace std; và sử dụng rõ ràng hơn, ví dụ: using std::transform; cụ thể.

+0

Vậy :: ToLower nói với giao diện trình biên dịch trong không gian tên gốc, và std :: ToLower báo cho trình biên dịch xem int không gian tên chuẩn. Đúng không? Và trong trường hợp này tôi muốn người cho phép từ không gian tên gốc không phải là không gian tên chuẩn. – user839913

+0

Phải. Hoặc bạn có thể ngừng sử dụng 'using namespace std' và tolower sẽ hoạt động bình thường :) – bdonlan

+3

Về mặt kỹ thuật, OP's :: tolower() chỉ tồn tại do một chi tiết thực hiện. Để đảm bảo rằng 'tolower' của thư viện C nằm trong không gian tên chung,' 'phải được bao gồm thay vì' '(xem' D.5 [depr.c.headers]/2') – Cubbi

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