2013-07-21 215 views
16

は、私が参照ポインタを使用して関数に値を送信しようとしている左辺値でなければなりませんが、それは私には私に完全に外国型エラーを与えたC++非constへの参照の初期値は、

#include "stdafx.h" 
#include <iostream> 

using namespace std; 

void test(float *&x){ 

    *x = 1000; 
} 

int main(){ 
    float nKByte = 100.0; 
    test(&nKByte); 
    cout << nKByte << " megabytes" << endl; 
    cin.get(); 
} 

エラー:初期非constは、私は、コードの上に修復するために何をしなければならないか見当がつかない左辺値

でなければならない参照の値は、誰かが私にそのコードを修正する方法についていくつかのアイデアを与えることができますか?感謝:)

+1

あなただけのポインタをドロップすることができ、使用代わりに明白な参照? –

+0

笑、今イムはlearncpp.comでチュートリアル以下と、そのサイトがどのように機能して参照ポインタを使用する方法を教え、私はあまりにもそれを試してみたいので..:Pところで感謝@Micha Wiedenmann –

+0

使用ポインタを参照する場合にのみ、関数外のポインタを変更する必要があります。 –

答えて

31

、あなたはそのポインタの値を変更しようとしているコンパイラを語っています。あなたのコードはそれをしませんが、コンパイラは将来そうすると思っています。いずれか、このエラーを修正x定数

// This tells the compiler that you are not planning to modify the pointer 
// passed by reference 
void test(float * const &x){ 
    *x = 1000; 
} 

か、testを呼び出す前にnKByteへのポインタを割り当てるための変数を作成する宣言する

float nKByte = 100.0; 
// If "test()" decides to modify `x`, the modification will be reflected in nKBytePtr 
float *nKBytePtr = &nKByte; 
test(nKBytePtr); 
+0

あなたの例とし説明は素晴らしいです、私はそれが今 '一時的な価値'、また、あなたのソリューション 'フロート* nKBy​​tePtr =&nKByte;を理解するので、別の答えとは異なるので、私は(必要があります! D –

3

あなたは&nKBytetestを呼び出すと、アドレス演算子は一時的な値を作成し、彼らはよく、一時的なものであるので、あなたが通常一時的な値への参照を持つことはできません。

引数の参照を使用していない、またはいっそのポインタを使用しないようにします。

+0

float nKBy​​te = 100.0; float * ptr =&nKByte;テスト(ptr); – thomas

+0

@thomasはい、動作しますが、この場合はポインタへの参照を使う必要はありません。答えを –

+0

おかげで、私は一時的な価値を創造&nKByte新しいことを学ぶ持っているとnow..and再び感謝:)迅速な回答を –

4

&nKByteは非constへの参照に結合することができない一時的な値を作成します。

void test(float *&x)void test(float * const &x)に変更するか、またはポインタを完全に削除してvoid test(float &x); /*...*/ test(nKByte);を使用します。あなたは非const参照によってポインタを渡す場合

+0

おかげで、今私はそれを理解するまで、私はそれを知りません:) –