2009-02-19 40 views
0

重构遗留代码,我碰到这个功能(伪)传来:超载,字符串和默认参数

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 ::字符串以char *满足第一个函数的参数列表(使用默认值来满足第二个参数),放弃但不尝试第二个函数...

我不会有问题这个问题,但我想知道为什么这会失败,以及是否有办法使其按预期工作。

+0

你能提供一个完整的代码示例来显示问题吗?上面的“伪代码”应该正确编译。 – 2009-02-19 13:54:22

+0

已解决/不是问题,请参阅下面的答案。现在我该怎么做 - 删除问题? – DevSolar 2009-02-19 14:15:04

回答

1

与往常一样,一旦问题解决了,解决方案就会变得微不足道,而且一直都很明显。

So I came up with a function using std::string...

...在我的工作目录,它编译就好了,但-I和-L在我的makefile在以前的版本库,这是一无所知的新功能的仍然指向。

对不起。我一直是个白痴。我希望这不会成为一种习惯。 ;-)

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

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

你说这是伪代码。你要留下什么吗?这些模板函数或成员函数是什么?请张贴更多的代码或尝试将其归结为更小的测试用例。

1

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

1

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