2015-07-23 14 views
6

Tôi có:: ToLower vs chênh lệch std :: ToLower

using namespace std; 
vector<char> tmp; 
tmp.push_back(val); 
... 

Bây giờ khi tôi thử

transform(tmp.begin(), tmp.end(), tmp.begin(), std::tolower); 

Nó không biên dịch, nhưng điều này biên dịch:

transform(tmp.begin(), tmp.end(), tmp.begin(), ::tolower); 

là gì vấn đề với std::tolower? Nó hoạt động với một đối số, ví dụ: std::tolower(56) biên dịch. Cảm ơn!

+1

liên quan/trùng lặp: http://stackoverflow.com/q/5270780/ (xem câu trả lời thứ hai http: // stackoverflow. com/a/5270970 /) – dyp

+0

@dyp Vì vậy, nếu 'std :: lower' cần hai đối số, cách' std :: tolower (56) 'hoạt động như thế nào? – hovo

+1

'std :: tolower' bị quá tải, có hai hàm (một [hàm từ thư viện C] (http://en.cppreference.com/w/cpp/string/byte/tolower) lấy một đối số và [một function template] (http://en.cppreference.com/w/cpp/locale/tolower) có hai đối số) với tên 'tolower' trong không gian tên' std'. Trong không gian tên chung, nếu có bất cứ điều gì, thì nó chỉ là 'tolower' của thư viện C lấy một đối số. – dyp

Trả lời

3

std::tolower có hai tình trạng quá tải và không thể giải quyết được cho UnaryOperation trong đó phiên bản C ::tolower thì không.

Nếu bạn muốn sử dụng std::tolower bạn có thể sử dụng một lambda như

transform(tmp.begin(), tmp.end(), tmp.begin(), [](unsigned char c) {return std::tolower(c); }); 
+3

Ngoài ra còn có một 'std :: tolower' đơn nhất, bạn chỉ cần phân biệt. –

+0

@BaummitAugen, nó có thể được định hướng thông qua '& std :: tolower'? –

+0

@AaronMcDaid Tôi không nghĩ vậy, nhưng bạn có thể thử nếu bạn muốn. :) –

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