3

2つのオーバーロードの変換が類似しているというエラーが発生します。私はあまりにも多くのことを試みましたが、どれも役に立ちませんでした。

これがそのコードです

CString GetInput(int numberOfInput, BOOL clearBuffer = FALSE, UINT timeout = INPUT_TIMEOUT);
CString GetInput(int numberOfInput, string szTerminationPattern, BOOL clearBuffer = FALSE, UINT timeout = INPUT_TIMEOUT);

文字列がどのようにlongに等しくなるのか理解できませんか?

私はVisualC++ 6を使用しています(そうです、私はその古いものを知っています、私はレガシーコードに取り組んでいるので、私はほとんど無力です)

編集:エラーをトリガーしているコード行は

l_szOption = GetInput(13, FALSE, 30 * 10);
4

5 に答える 5

5

この問題は、timeout引数を符号付き整数値として指定しているために発生します。これは、関数の最初のバージョンでは符号なし整数値に変換する必要があります(timeoutパラメーターはとして宣言されているためUINT)。

つまり、関数の最初のバージョンでは3番目の引数の変換が必要ですが、関数の2番目のバージョンでは2番目の引数(FALSE、は、だけです0)の変換が必要stringです。この場合、どちらの機能も他の機能よりも優れておらず、過負荷の解決は失敗します。

3番目の引数に符号なし型を明示的に指定してみてください

l_szOption = GetInput(13, FALSE, 30U * 10);

また

l_szOption = GetInput(13, FALSE, (UINT) 30 * 10);

(どちらか好きな方)そしてコードは期待通りにコンパイルされるべきです。

言い換えれば、コンパイラはあなたのコードについて文句を言うのは絶対に正しいのです。あなたのコードは確かに壊れています。コードの問題は、次の簡単な例とまったく同じ性質です。

void foo(int i, unsigned j);
void foo(unsigned i, int j);

int main() {
  foo(0, 0);
}

このコードも、まったく同じ理由でコンパイルに失敗します。

于 2009-12-23T06:35:05.113 に答える
2
GetInput(13, FALSE, 30 * 10);

私の推測では

FALSE ==> o ==> NULL is getting converted to std::string(NULL) 

したがって、インスタンス化するメソッドを決定できません。

T0はこれを証明しますこれをチェックしてください:

GetInput(13, TRUE, 30 * 10); //できます

于 2009-12-23T05:54:29.923 に答える
1

BOOLその関数に、、でも、でもない2番目のパラメーターを渡している可能性がありますがstring、暗黙的にどちらかに変換できる型です。

たとえば、文字ポインタ。

于 2009-12-23T05:29:42.090 に答える
1

関数を呼び出すときのあいまいさを解決するには、2 番目のパラメーターをキャストするか、それが実際に std::string である場合にBOOL使用します。string("whatever")

于 2009-12-23T05:41:58.627 に答える
1

次のケースを考えてみましょう:

BOOL は int の typedef です。

GetString(10,'a'); // compiler get confused in resolving the function

'a' を BOOL に変換するか文字列に変換するか ???

関数呼び出しを行うときは、 static_castを使用して適切な引数を与え、呼び出したい関数を作成します。

char ch = 'a';
GetString(10,static_cast<BOOL>(ch)); // calls function with 2nd argument as BOOL

GetString(10,static_cast<string>(ch)); //calls function with 2nd argument as string
于 2009-12-23T05:44:49.073 に答える