代码之家  ›  专栏  ›  技术社区  ›  DevSolar

重载、字符串和默认参数

  •  0
  • DevSolar  · 技术社区  · 17 年前

    重构旧代码时,我遇到了这个函数(伪代码):

    int getMessage( char * buffer, int size = 300 );
    

    哎呀,看看那个等待溢出的缓冲区。所以我想出了一个使用std::string的函数,并认为使用函数重载会更好:

    int getMessage( std::string & buffer );
    

    到目前为止,一切都很好。但当我试图 呼叫 带字符串的函数:

    std::string buffer;
    int rc = getMessage( buffer );
    

    我得到这个错误:

    cannot convert 'std::string' to 'char*' for argument '1' to 'int getMessage(char*, int)'
    

    显然,编译器(gcc 4.1.2)试图将std::string转换为char*来满足第一个函数的参数列表(使用默认值来满足第二个参数),但没有尝试第二个函数…

    我在解决这个问题上不会有问题,但我想知道为什么会失败,以及是否有办法让它按预期工作。

    5 回复  |  直到 17 年前
        1
  •  3
  •   Kasprzol    17 年前

    它在我的GCC4.3.2上按预期工作,也许你拼错了重载的名称?没有从std::string到char*的转换,因此编译器在选择正确的重载时不会有任何问题。

    $ cat test.cpp
    #include <string>
    #include <stdio.h>
    
    int getMessage( char * buffer, int size = 300 )
    {
    printf("1\n");
    return 1;
    }
    
    int getMessage( std::string & buffer )
    {
    printf("2\n");
    return 2;
    }
    
    int main()
    {
    std::string buffer;
    buffer = "Hello";
    int rc = getMessage( buffer );
    }
    
    $ g++ test.cpp -Wall -pedantic
    test.cpp: In function ‘int main()’:
    test.cpp:20: warning: unused variable ‘rc’
    $ ./a.out 
    2
    $ $ g++ -v 2>&1|tail -n1
    gcc version 4.3.2 (Ubuntu 4.3.2-1ubuntu12) 
    $
    
        2
  •  1
  •   Brian Neal    17 年前

    嗯。没有从std::string到char*的隐式转换,所以这不是您的问题。您确定您的新功能在呼叫站点可见吗?

    你说这是伪代码。你忘了什么吗?这些是模板函数还是成员函数?请发布更多的代码,或者尝试将其简化为一个较小的测试用例。

        3
  •  1
  •   BatchyX    17 年前

    我猜函数的字符串版本的重载在您调用它的地方是不可见的。您确定它在正确的头文件中,并且拼写正确吗?

        4
  •  1
  •   dirkgently    17 年前

    在作用域中是否有“int getmessage(std::string&buffer);”声明?您遇到此错误是因为找不到正确的函数。

        5
  •  1
  •   DevSolar    17 年前

    和往常一样,一旦问题解决了,解决方案就变得微不足道,而且应该一直都是显而易见的。

    所以我想出了一个使用std::string的函数…

    …在我的工作目录中,它编译得很好,但是makefile中的-i和-l仍然指向库的前一个版本,而这个版本幸好没有发现新的函数。

    抱歉打扰了。我是个白痴。我希望这不会成为习惯。;-)

    推荐文章