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* に変換して最初の関数のパラメーター リスト (2 番目のパラメーターを満たすために既定値を使用) を満足させようとしますが、あきらめますが、2 番目のパラメーターは試行しません。関数...

この問題を回避するのに問題はありませんが、これが失敗する理由と、意図したとおりに機能させる方法があるかどうかを知りたいです。

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 を使用して関数を思いつきました...

...正常にコンパイルされた私の作業ディレクトリでは、しかし、私のメイクファイルの -I と -L はまだライブラリの以前のバージョンを指していました。

ご迷惑をおかけして申し訳ありません。私はばかだった。これが癖にならないことを願っています。;-)

于 2009-02-19T14:13:21.400 に答える