• C++常见错误之:no matching function for call to transfor


    博客原文地址:http://www.2cto.com/kf/201012/80701.html

    初学C++哈,不知道这个错误是不是很silly,高手轻拍。情况如下:

    #include
    #include
    #include

    using namespace std;

    int main (int argc, char * const argv[]){
    string str = "Hello";
    transform(str.begin(), str.end(), str.begin(), toupper);
    cout << str << endl;
    return 0;
    }程序的意思很简单,去把Hello都转换为大写。

    编译死活不通过:

    $ g++ -g -Wall strToUpper.cpp -o strToUpper
    strToUpper.cpp: In function ‘int main(int, char* const*)’:
    strToUpper.cpp:9: error: no matching function for call to ‘transform(__gnu_cxx::__normal_iterator, std::allocator > >, __gnu_cxx::__normal_iterator, std::allocator > >, __gnu_cxx::__normal_iterator, std::allocator > >, )’后来查明原因如下——

    我们先看看这个函数的定义:

    template OutIter transform(InIter start, InIter end, OutIter result, Func unaryFunc)

    它要求参数和返回值都要是char。Linux中将toupper实现为一个宏而不是函数:
    /usr/lib/syslinux/com32/include/ctype.h:

    /* Note: this is decimal, not hex, to avoid accidental promotion to unsigned */
    #define _toupper(__c) ((__c) & ~32)
    #define _tolower(__c) ((__c) | 32)

    __ctype_inline int toupper(int __c)
    {
    return islower(__c) ? _toupper(__c) : __c;
    }

    __ctype_inline int tolower(int __c)
    {
    return isupper(__c) ? _tolower(__c) : __c;
    }

    有三种解决方法:

    1.因为在全局命名空间中有实现的函数(而不是宏),所以我们明确命名空间,这并不是总奏效,但是在我的g++环境中没有问题:

    transform(str.begin(), str.end(), str.begin(), ::toupper);

    2.自己写一个函数出来—wraper

    inline char charToUpper(char c)
    {
    return std::toupper(c);
    }

    3.强制转化:将toupper转换为一个返回值为int,参数只有一个int的函数指针。

    transform(str.begin(), str.end(), str.begin(), (int (*)(int))toupper);

  • 相关阅读:
    集合set() 和 深浅copy
    Python 数据类型的操作——字典
    Python()- 面向对象
    面向对象的软件开发
    Python数据类型的操作——列表、元组
    Python 数据类型的操作——字符串
    Linux下386中断处理
    任务的休眠与唤醒
    Linux下SIGSTOP的特殊特征和实现
    内核线程对信号的处理策略
  • 原文地址:https://www.cnblogs.com/wmx3ng/p/2775963.html
Copyright © 2020-2023  润新知