1

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

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;

非常感谢

4

2 回答 2

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;

我收到与您类似的错误(不完全相同)。这是因为它将这个版本的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';
}

编辑:我不得不说,我很困惑为什么你要专门选择那个版本,而不是得到一个模棱两可的错误。但我无法准确猜测您的代码中发生了什么变化......

于 2013-07-03T07:25:39.203 回答
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;
}
于 2013-07-03T07:20:00.910 回答