zoukankan      html  css  js  c++  java
  • 【C++错误处理】no matching function for call to transform

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/

    初学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 > >, )’</CHAR*,></CHAR*,></CHAR*,>

    后来查明原因如下——

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

    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);

    作者:gnuhpc
    出处:http://www.cnblogs.com/gnuhpc/


                   作者:gnuhpc
                   出处:http://www.cnblogs.com/gnuhpc/
                   除非另有声明,本网站采用知识共享“署名 2.5 中国大陆”许可协议授权。


    分享到:

  • 相关阅读:
    创建数据库指定编码格式
    java开发环境配置
    Eclipse 配置工程
    声明式事务管理 的5 种方式
    web容器启动顺序
    2.1 实践篇:使用ping来检测网速
    1.1 mysql安装
    1.2 测试人员与开发人员比例
    1.0 软件测试能力
    1.4 测试各阶段(单元、集成、系统 、Alpha、Beta、验收)
  • 原文地址:https://www.cnblogs.com/gnuhpc/p/2811962.html
Copyright © 2011-2022 走看看