为什么ptr_fun(tolower)不能在mingw中编译?

时间:2010-10-30 19:03:44

标签: c++ mingw

我正在尝试使用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有什么问题?

感谢。

3 个答案:

答案 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_typeresult_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或中间变量指定。