首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么ptr_fun(tolower)没有在明明威中编译?

为什么ptr_fun(tolower)没有在明明威中编译?
EN

Stack Overflow用户
提问于 2010-10-30 19:03:44
回答 3查看 1.1K关注 0票数 5

我正在尝试使用Qt 2.0.1编译以下程序:

代码语言:javascript
复制
void f()
{
    string a = "abc";
    transform(a.begin(), a.end(), a.begin(), ptr_fun(tolower));
}

mingw抛出以下错误:

不匹配调用ptr_fun( <未解析重载函数类型> )

该函数在VC++ 2010 Express中编译得很好。交友有什么问题吗?

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-30 19:12:07

问题在于函数模板引入的歧义。

代码语言:javascript
复制
template <class charT> charT tolower(charT c, const locale& loc);

我猜mingw间接地从您的程序包含的一个头中包含了<locale>,而VC++没有。

您可以通过使用cast消除tolower的歧义来解决这个问题:

代码语言:javascript
复制
typedef int (*foo)(int);
ptr_fun((foo)tolower);

或者,如果您喜欢维护程序员向您扔鞋:

代码语言:javascript
复制
ptr_fun((int (*)(int))tolower);

注意,正如Armen所说,这里实际上并不需要ptr_fun。它将一元函数转换为适应性一元函数,但transform不需要它的参数具有适应性。区别在于该类型是否有用于argument_typeresult_type的嵌套类型。原始函数类型不存在,ptr_fun返回一个函数类型。

最后,如果在您的平台上签名了C tolower,那么在char上调用C char通常是不安全的。您的示例字符串是可以的,因为"abc“中没有一个字符是负的,但是您应该这样做:

代码语言:javascript
复制
char fixed_tolower(char c) {
    return tolower((unsigned char)c);
}

transform(..., fixed_tolower);

或者为了更好的内衬机会:

代码语言:javascript
复制
struct fixed_tolower : unary_function<char, char> {
    char operator()(char c) const {
        return tolower((unsigned char)c);
    }
};

transform(..., fixed_tolower());

我没有检查GCC是否真的有什么不同,无论是内联的POV,还是tolower的混合实现是否真的限制在负数上。

票数 5
EN

Stack Overflow用户

发布于 2010-10-30 19:06:46

你为什么不直接打电话

代码语言:javascript
复制
transform (a.begin, a.end(), a.begin(), tolower);
票数 1
EN

Stack Overflow用户

发布于 2010-10-30 19:07:55

交往没什么不对的。tolower有多个重载,生成消息“未解析的重载函数”。

您需要通过一些强制转换的(int)(*)(char)tolower或中间变量指定要使用的重载。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4060213

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档