重载,字符串和默认参数

时间:2009-02-19 13:44:22

标签: c++ overloading

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

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 个答案:

答案 0 :(得分:3)

它在我的GCC 4.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) 
$

答案 1 :(得分:1)

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

你说这是伪代码。你要离开吗?这些模板功能或成员功能?请发布更多代码或尝试将其归结为较小的测试用例。

答案 2 :(得分:1)

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

答案 3 :(得分:1)

你有`int getMessage(std :: string&amp; buffer);'的声明吗?在适用范围?您正在尝试此错误,因为找不到正确的功能。

答案 4 :(得分:1)

与往常一样,一旦问题得到解决,解决方案就会变得非常简单,而且应该一直很明显。

  

所以我想出了一个使用std :: string ...

的函数

...在我的工作目录中,编译得很好,但是我的makefile中的-I和-L仍然指向该库的先前版本,它很幸福地没有意识到新函数。

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