我有一个奇怪的错误,代码在之前工作但在一段时间后它停止编译。 错误是:
Could not find a match for 'std::transform<InputIterator,OutputIterator,UnaryOperation>(char *,char *,char *,charT (*)(charT,const locale &))' in function main()
以及它所指的行是:
string ans;
cin>>ans;
std::transform(ans.begin(), ans.end(), ans.begin(), ::tolower);
有人可以帮我解释为什么会这样吗? 我使用的包括:
#include <fstream.h>;
#include <iostream.h>;
#include <string>;
#include <time.h>;
#include <vector>;
using namespace std;
非常感谢
答案 0 :(得分:2)
如果你说的话,这直到最近才起作用,我必须假设有人在代码中的其他地方引入了一个小的改变,打破了事情。 现在,这有效:
#include <string>
#include <algorithm>
#include <cctype>
#include <iterator>
#include <iostream>
int main()
{
std::string s1 {"Hello"}, s2;
std::transform(
std::begin(s1),
std::end(s1),
std::back_inserter(s2),
::tolower);
std::cout << s2 << '\n';
}
即。它打印hello
。
如果我在顶部添加这两行:
#include <locale>
using std::tolower;
我得到了类似的错误(不完全相同)。这是因为它将this version of tolower
纳入范围。
要取回“正确”版本(假设您确实是cctype
标题中的版本?),您可以使用static_cast
选择所需的版本:
// ...
#include <locale>
using std::tolower;
int main()
{
std::string s1 {"Hello"}, s2;
std::transform(
std::begin(s1),
std::end(s1),
std::back_inserter(s2),
static_cast<int(*)(int)>(::tolower)); // Cast picks the correct fn.
std::cout << s2 << '\n';
}
编辑:我不得不说,我很困惑为什么你特意拿起那个版本,而不是弄错模糊。但我无法猜测你的代码中究竟发生了什么变化......
答案 1 :(得分:0)
它对我有用。也许你忘了加入<algorithm>
。
它应该以这种方式工作:
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
string ans;
cin>>ans;
std::transform(ans.begin(), ans.end(), ans.begin(), ::tolower);
cout << ans;
return 0;
}