2009-02-19 79 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)'的聲明;'在適用範圍?您遇到此錯誤是因爲沒有找到正確的功能。