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()
);