我正在尝试使用Qt Creator 2.0.1编译以下程序:
void f()
{
string a = "abc";
transform(a.begin(), a.end(), a.begin(), ptr_fun(tolower));
}
mingw会抛出以下错误:
没有用于调用ptr_fun的匹配函数(<未解析的重载函数类型>)
使用VC ++ 2010 Express可以很好地编译该函数。 mingw有什么问题?
感谢。
答案 0 :(得分:5)
问题是功能模板
引入的歧义template <class charT> charT tolower(charT c, const locale& loc);
我猜mingw间接地从你的程序包含的一个头文件中包含<locale>
,而VC ++没有。{/ p>
您可以通过使用强制转换器消除tolower
歧义来解决此问题:
typedef int (*foo)(int);
ptr_fun((foo)tolower);
或者,如果您希望维护程序员向您扔鞋:
ptr_fun((int (*)(int))tolower);
请注意,正如Armen所说,这里实际上并不需要ptr_fun
。它将一元函数转换为可适应的一元函数,但transform
不需要其参数可适应。不同之处在于该类型是否具有argument_type
和result_type
的嵌套typedef。原始函数类型没有,ptr_fun
返回一个类似的函子类型。
最后,如果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还是POV,tolower
的mingw实现是否实际上都是负数。
答案 1 :(得分:1)
你为什么不打电话
transform (a.begin, a.end(), a.begin(), tolower);
答案 2 :(得分:0)
mingw没有错。 tolower
有多个重载,生成消息“未解析重载功能。
您需要指定要使用哪个重载,通过某些强制转换(int)(*)(char)tolower
或中间变量指定。