std::toupper
是一個重載函數;這就是爲什麼你會在錯誤消息中獲得<unresolved overloaded function type>
。要選擇一個特定的過載,你需要將其強制轉換:
static_cast<int(*)(int)>(std::toupper)
for_each
也沒有完成這個任務,它會調用toupper
列表中的每個字符串,然後丟棄其結果是正確的選擇。 std::transform
將是合適的選擇 - 它將其輸出寫入輸出迭代器。但是,toupper
適用於字符,不適用於字符串。你仍然可以使用transform
字符串中的調用toupper
每個字符:
std::transform(
a_string.begin(),
a_string.end(),
a_string.begin(),
static_cast<int(*)(int)>(std::toupper)
);
它可能會更清楚在這個簡單的情況下,使用循環:
for (TVector::iterator i = a_list.begin(), end = a_list.end(); i != end; ++i) {
for (std::string::size_type j = 0; j < i->size(); ++j) {
(*i)[j] = toupper((*i)[j]);
}
}
但是,如果你想將它與寫只有<algorithm>
和<iterator>
工具,你可以做一個仿函數:
struct string_to_upper {
std::string operator()(const std::string& input) const {
std::string output;
std::transform(
input.begin(),
input.end(),
std::back_inserter(output),
static_cast<int(*)(int)>(std::toupper)
);
return output;
}
};
// ...
std::transform(
a_list.begin(),
a_list.end(),
a_list.begin(),
string_to_upper()
);
爲(TVector ::迭代器I = a_list.begin(),a_list.end(); + +1){ std :: transform(i-> begin(),i-> end(),i-> begin(),:: toupper); } – gda2004