4

次のコードをコンパイルしようとすると、引数2からの変換が不明long unsigned intlong unsigned int&であるというエラーメッセージが表示されます。

void build(int* &array, unsigned long& index) {
  if (index == 0)
    return;
  else {
    heapify(array, index);
    build(array, index-1);
  }
}

誰かがこれが起こる理由と、このエラーの背後にあるロジックを説明できますか?

4

5 に答える 5

6

の2番目の引数にbuildは、参照が必要です(でマークされてい&ます)。参照は一種のポインタのようなものであるため、メモリアドレスを持つ実際の変数のみを使用できます。

これが、のような式を使用できない理由ですindex-1

于 2012-07-10T03:47:33.120 に答える
2

非定数参照は、C++の左辺値にのみバインドできます。index-1一時的なものを返します。これは、参照にバインドされている場合、すぐにスコープから外れ、ぶら下がっている参照があります。ただし、 const参照は一時参照にバインドでき、一時参照の有効期間をconst参照の有効期間まで延長します。unsigned long&だから、あなたがそれに変更することができればうまくconst unsigned long&いくはずです。

于 2012-07-10T03:49:33.283 に答える
2

の2番目の引数buildは、への参照unsigned longです。ただし、再帰呼び出しでは、実際の値(つまり「右辺値」)を渡します。

関数を次のように書き直すと、問題は解消されます。

void build(int* &array, unsigned long& index) {
   if (index == 0)
     return;
   else {
    heapify(array,index);
    index -= 1;
    build(array,index);
  }
}

しかし、これはあなたが望むものではないかもしれないことに注意してください。の値はindex、再帰呼び出しの前に変更されます。index += 1関数の全体的な目的によっては、呼び出し後に元に戻す()ことが必要になる場合があります。

于 2012-07-10T03:49:47.683 に答える
1

The Design and Evolution of C++、第 3.7 章、p86 を参照してください。この例が示されています。

void incr(int& rr) { rr++; }

void g()
{
    double ss = 1;
    incr(ss)     // note: double passed, int expected
                 // (fixed: error in Release 2.0)
}

C++ の最初のバージョンでは、型のテンポラリがからvalueでint作成され、そのテンポラリは に渡され、変更されませんでした。この種の予期しない動作を防ぐために、言語が変更され、一時変数 (つまり、名前のない変数) が非 const 参照にバインドできなくなりました。発信者。一時が黙って作成された場合、呼び出し元はその情報を失います。double1incrss

void* get_ptr(int& error);  // sets error=0 if returned pointer is valid

void g()
{
    unsigned err = 0;        // oops, wrong type
    void* p = get_ptr(err);  // uh-oh, error status stored in temporary
    if (err == 0)            // condition always true
        use_ptr(p);          // uh-oh! pointer may not be valid!
}

const 以外の参照がテンポラリにバインドできる場合、このプログラムは危険です。なぜなら、 のようなget_ptr(err)テンポラリが作成され、テンポラリにエラー ステータスが設定されるため、問題があってもゼロのままになるからです。intget_ptr(int(err))err

引数は呼び出し元に情報を返すために使用されないため、関数の作成者が一時変数を受け入れることができるようにしたい場合、関数は値によってパラメーターを受け取ることができます。

void blah(int rr);

または const 参照によって:

void blah(const int& rr);
于 2012-07-10T19:58:16.007 に答える
-1

エラーメッセージは何行にありますか?参照による(つまり、のアドレス)long unsigned intが必要な場合は、forインデックスを渡しているようです。long unsigned intlong unsigned int

于 2012-07-10T03:47:23.643 に答える