重构遗留代码,我遇到了这个函数(伪代码):
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 *以满足第一个函数的参数列表(使用默认值来满足第二个参数),放弃,但不尝试第二个功能......
解决这个问题我不会有问题,但我想知道为什么会失败,以及是否有办法让它按预期工作。
答案 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仍然指向该库的先前版本,它很幸福地没有意识到新函数。
抱歉打扰了。我一直是个白痴。我希望这不会成为一种习惯。 ; - )