zoukankan      html  css  js  c++  java
  • 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);

  • 相关阅读:
    Oracle数据库五种约束
    Oracle中sql的基本使用
    暮光之城》剧本
    英语电影剧本大全(中英对照)
    加勒比海盗1英文剧本
    公主日记英文剧本
    教父2-英文版
    <老友记>学习笔记
    霍夫变换Hough
    景深(Depth of Field)
  • 原文地址:https://www.cnblogs.com/wmx3ng/p/2775963.html
Copyright © 2011-2022 走看看