2015-04-28 12 views
6

Il codice sopra riportato non funziona. L'oggetto predefinito predefinito f nel costruttore di Foo si lamenta del fatto che il valore val non è dichiarato nell'ambito. Non capisco perché non è dichiarato.Variabile non dichiarata nell'oggetto predefinito costruito nel costruttore

struct Foo2 
{ 
    Foo2(int val) 
    {} 
}; 

struct Foo 
{ 
    Foo(int val, Foo2 f = Foo2(val)) 
    {} 
}; 

int main() 
{ 
    Foo f(1); 
    return 0; 
} 
+1

Non è possibile utilizzare i parametri di parametri di default. – chris

+2

Questa domanda non ha costruttori predefiniti. –

risposta

5

Secondo il C++ Standard (8.3.6 Argomenti predefiniti):

9 Gli argomenti predefiniti vengono valutati ogni volta t viene chiamata la funzione. L'ordine di valutazione degli argomenti delle funzioni non è specificato. Di conseguenza, i parametri di una funzione non devono essere utilizzati in un argomento predefinito, anche se non vengono valutati. I parametri di una funzione dichiarati prima di un argomento predefinito sono nell'ambito e possono nascondere lo spazio dei nomi di classe e i membri della classe.

In qualsiasi C++ (non solo C++ 2014) è possibile sovraccaricare il costruttore. Per esempio

struct Foo 
{ 
    Foo(int val) 
    { Foo2 f(val); /*...*/ } 
    Foo(int val, Foo2 f) 
    {} 
}; 

oppure è possibile utilizzare un costruttore delegando (se il compilatore supporta il nuovo standard)

struct Foo 
{ 
    Foo(int val) : Foo(val, Foo2(val)) 
    {} 
    Foo(int val, Foo2 f) 
    {} 
}; 
2

Ecco come funziona la lingua; gli argomenti predefiniti non possono dipendere da altri parametri, poiché l'ordine della loro inizializzazione non viene specificato.

In C++ 11 o successiva, è possibile ovviare a questo con un sovraccarico:

Foo(int val) : Foo(val, Foo2(val)) {} 
+0

Oppure è possibile utilizzare l'overloading. – refi64

+1

@ kirbyfan64sos Cos'è questo? – LogicStuff

+2

@ kirbyfan64sos: Sto usando l'overloading. –

0
struct Foo2 
{ 
    int x; 
    Foo2(int val): x(val) {} 
}; 

struct Foo 
{ 
    int y; 
    Foo2 f2; 
    Foo(int val, Foo2 f): y(val), f2(f) {} 
    Foo(int val): y(val), f2(val) {} 
}; 

int main() 
{ 
    Foo f(1); 
} 
+1

Ciò presuppone che 'f2' sia una variabile membro di' Foo'. – Beta

0

È possibile utilizzare i modelli per risolvere questo:

struct Foo2 
{ 
    Foo2(int val) 
    {} 
}; 

template <int val> 
struct Foo 
{ 
    Foo(Foo2 f = Foo2(val)) 
    {} 
}; 

int main() 
{ 
    Foo<1> f = Foo<1>(); 
    return 0; 
} 
+0

Sì, lo so ma voglio che 'val' sia una variabile di runtime –

+1

Ah, avresti dovuto dirlo in primo luogo. –

Problemi correlati