3

以下の私のコードに何か問題がありますか?コンパイルエラーが発生しました!

typedef unsigned char BYTE;

void foo(char* & p)
{
 return;
}

int main()
{
  BYTE * buffer;
  // error C2664: 'foo' : cannot convert parameter 1 from 'char *' to 'char *&'
  foo ((char*)buffer);

  return 0;
}

よろしくお願いします、ジョージ

4

7 に答える 7

14

名前のない一時エンティティにキャストするBYTE*と、タイプが。で作成されます。呼び出す関数はへの参照を取りますが、それは実変数ではないため、そのような一時エンティティへの参照をとることはできません。char*char*char*

于 2009-02-15T18:36:49.523 に答える
7

reinterpret_cast<char*&>静的キャストの代わりに実行できます

foo (reinterpret_cast<char*&>(buffer));

または、引数を const 参照にすることもできます。

void foo(char* const & p)
{
    return;
}
于 2009-02-15T18:56:30.677 に答える
4

fooのパラメーターは、ポインターへの参照です。バッファはBYTEポインタです。参照には完全一致が必要ですが、割り当て互換ではありません。

2つの解決策:

1)おそらくpの前に「&」は必要ありません。それを緩めると、コードがコンパイルされます。

2)参照が機能するように、正しく型指定された変数を使用します。

 BYTE * buffer;
 char * b = (char *) buffer;
 foo (b);
 buffer = (BYTE*) b;  // because foo may change b
于 2009-02-15T18:39:25.587 に答える
2

ポインターは「buffer左辺値」ですが、キャスト操作が適用されると、式は次のようになります。

(char*) buffer

は「右辺値」です (実際には「変更可能な右辺値」ですが、これは今後の C++0x でのみ問題になると思います)。非 const 参照を右辺値にバインドすることはできません。

ただし、const参照は右辺値にバインドできます。したがって、プログラムを次のように変更するとコンパイルされます。

void foo(char* const& p)  // added 'const'

Stephan T. Lavavej は最近、左辺値、右辺値、および参照に関する優れた情報を含むブログ エントリを投稿しました。

この記事は、実際には C++0x で導入される新しい「右辺値参照」に関するものですが、左辺値と右辺値とは何か、および C++98 で参照を操作できる方法とできない方法についての優れた説明があります。長い間読んでいますが、それだけの価値があります。

于 2009-02-15T20:06:23.597 に答える
1

変数参照を渡そうとしていますが、参照できるchar*型の変数はありません。

私が正しく覚えていれば、このように機能するはずです:

BYTE * buffer;
char* ptr = (char*)buffer;
foo(ptr); // now you have a matching variable to refer to. 

たぶん、参照の代わりに値を渡す方が簡単でしょう。

于 2009-02-15T18:38:11.923 に答える
1

まず、あなたが言うとき

(char)buffer

あなたはコンパイラに嘘をついています-バッファはポインタであり、文字ではありません。

第二に、キャストが機能したとしても、それは一時的なものを生成し、それは非定数参照にバインドすることはできません。

したがって、はい、コードには少なくとも2つの問題があります。

于 2009-02-15T18:38:25.230 に答える
1

このように書いてください:

int main() { 
  BYTE * buffer; 
  char* pbuf = (char*)buffer;
  foo(pbuf);
}
于 2009-02-15T18:39:18.440 に答える