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::string 转换为 char* 以满足第一个函数的参数列表(使用默认值来满足第二个参数),放弃了,但没有尝试第二个功能...

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

4

5 回答 5

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) 
$
于 2009-02-19T13:52:33.727 回答
1

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

你说这是伪代码。你是不是遗漏了什么?这些是模板函数还是成员函数?请发布更多代码或尝试将其归结为更小的测试用例。

于 2009-02-19T13:53:47.390 回答
1

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

于 2009-02-19T13:54:21.633 回答
1

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

于 2009-02-19T14:10:31.967 回答
1

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

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

...在我的工作目录中,它编译得很好,但是我的 makefile 中的 -I 和 -L 仍然指向以前版本的库,这很幸运地不知道新功能。

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

于 2009-02-19T14:13:21.400 回答