无法找到'std :: transform ...'的匹配项

时间:2013-07-03 06:55:30

标签: c++ templates runtime transform lowercase

我有一个奇怪的错误,代码在之前工作但在一段时间后它停止编译。 错误是:

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;

非常感谢

2 个答案:

答案 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;
}