2013-07-21 79 views
16

sto cercando di trasmettere il valore in funzione utilizzando puntatore di riferimento ma mi ha dato un errore di completamente estraneo-tipo a meC++ valore iniziale di riferimento non-const deve essere un lvalue

#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(); 
} 

Errore: iniziale valore di riferimento a non-const deve essere un lvalue

Non ho idea di cosa devo fare per riparare il codice di cui sopra, qualcuno può darmi qualche idea su come risolvere quel codice? grazie :)

+1

si può solo cadere il puntatore, l'uso un semplice riferimento invece? –

+0

haha, ora perché sto seguendo il tutorial su learncpp.com e quel sito mi insegna come usare il puntatore di riferimento in funzione, quindi voglio provarlo anche io ...: p btw grazie @Micha Wiedenmann –

+0

Usa un riferimento a un puntatore solo quando vuoi modificare un puntatore al di fuori della funzione. –

risposta

31

Quando si passa un puntatore a un riferimento non const, si indica al compilatore che si intende modificare il valore di quel puntatore. Il tuo codice non lo fa, ma il compilatore pensa che lo faccia, o pensa di farlo in futuro.

Per correggere questo errore, o dichiarano x costante

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

o fare una variabile a cui si assegna un puntatore a nKByte prima di chiamare test:

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

il tuo esempio con la spiegazione è fantastica, quindi ora capisco "valore temporaneo", anche la tua soluzione 'float * nKBytePtr = & nKByte;' anche diversa con un'altra risposta, quindi ho (devo!) scegliere la tua soluzione come risposta .. grazie ancora: D –

3

Quando si chiama test con &nKByte, l'operatore di indirizzo crea un valore temporaneo , e non si può normalmente riferimenti ai valori temporanei, perché sono, beh, temporanea.

O non utilizzare un riferimento per l'argomento o, meglio ancora, non utilizzare un puntatore.

+0

float nKByte = 100.0; float * ptr = & nKByte; Test (PTR); – thomas

+0

@thomas Sì, funzionerebbe, ma in questo caso non è necessario utilizzare un riferimento a un puntatore. –

+0

grazie per le risposte, ho imparato cose nuove che & nKByte creano un valore temporaneo e non lo so fino ad ora..e grazie ancora :) –

4

Il &nKByte crea un valore temporaneo, che non può essere associato a un riferimento a non-const.

È possibile modificare a void test(float * const &x) oppure è possibile eliminare completamente il puntatore e utilizzare void test(float &x); /*...*/ test(nKByte);.

+0

grazie per le risposte rapide, ora capisco :) –

Problemi correlati