我正在尝试使用Qt 2.0.1编译以下程序:
void f()
{
string a = "abc";
transform(a.begin(), a.end(), a.begin(), ptr_fun(tolower));
}mingw抛出以下错误:
不匹配调用ptr_fun( <未解析重载函数类型> )
该函数在VC++ 2010 Express中编译得很好。交友有什么问题吗?
谢谢。
发布于 2010-10-30 19:12:07
问题在于函数模板引入的歧义。
template <class charT> charT tolower(charT c, const locale& loc);我猜mingw间接地从您的程序包含的一个头中包含了<locale>,而VC++没有。
您可以通过使用cast消除tolower的歧义来解决这个问题:
typedef int (*foo)(int);
ptr_fun((foo)tolower);或者,如果您喜欢维护程序员向您扔鞋:
ptr_fun((int (*)(int))tolower);注意,正如Armen所说,这里实际上并不需要ptr_fun。它将一元函数转换为适应性一元函数,但transform不需要它的参数具有适应性。区别在于该类型是否有用于argument_type和result_type的嵌套类型。原始函数类型不存在,ptr_fun返回一个函数类型。
最后,如果在您的平台上签名了C tolower,那么在char上调用C char通常是不安全的。您的示例字符串是可以的,因为"abc“中没有一个字符是负的,但是您应该这样做:
char fixed_tolower(char c) {
return tolower((unsigned char)c);
}
transform(..., fixed_tolower);或者为了更好的内衬机会:
struct fixed_tolower : unary_function<char, char> {
char operator()(char c) const {
return tolower((unsigned char)c);
}
};
transform(..., fixed_tolower());我没有检查GCC是否真的有什么不同,无论是内联的POV,还是tolower的混合实现是否真的限制在负数上。
发布于 2010-10-30 19:06:46
你为什么不直接打电话
transform (a.begin, a.end(), a.begin(), tolower);发布于 2010-10-30 19:07:55
交往没什么不对的。tolower有多个重载,生成消息“未解析的重载函数”。
您需要通过一些强制转换的(int)(*)(char)tolower或中间变量指定要使用的重载。
https://stackoverflow.com/questions/4060213
复制相似问题