Quando utilizzo la notazione di richiamo del costruttore (declare-) che definisce un puntatore al puntatore (invece della notazione di assegnazione - ovviamente che farà la stessa cosa in fase di esecuzione, è solo una convenzione), ricevo un errore del compilatore. Mi stavo chiedendo perché questo sia.Perché è illegale definire un puntatore alla variabile puntatore con la notazione di richiamo del costruttore?
struct Foo
{ /* ... */ };
int main(int argc, char** argv)
{
Foo* parFoo = new Foo[2];
Foo** ppFoo(&parFoo); // invalid: C2059
Foo** ppFoo = &parFoo; // OK
delete[] parFoo;
}
L'errore è un C2059 - token non valido, che non dice molto. Tuttavia, lo &
non è il problema (il che significa che probabilmente non è un errore di precedenza dell'operatore). Se faccio la seguente:
int main(int argc, char** argv)
{
Foo* parFoo = new Foo[2];
Foo** ppFoo = &parFoo; // OK
Foo** ppFoo2(ppFoo); // invalid: C2061
delete[] parFoo;
}
... poi ho un C2061, il che significa che questa volta è l'identificatore ppFoo
che è nel posto sbagliato.
Quale regola sintattica provoca questo, ovvero perché non è possibile utilizzare la notazione di richiamo del costruttore per definire i puntatori ai puntatori, solo i tipi "meno indicativi"?
[Works for me] (http://ideone.com/OlIPKZ). Forse questa è una cosa di VisualC++. –
Primo esempio compilato bene usando ideone.com (gcc suppongo). Per quanto riguarda il secondo, probabilmente hai fatto un errore, dovresti essere Foo ** ppFoo2 (ppFoo)? <- nota ppFoo. Beh, in realtà c'è anche un errore nel primo esempio (nomi duplicati), ma questo è minore. – queen3
@ queen3 +1 per il suggerimento di ideone.com, è abbastanza bello e per individuare l'errore di battitura. risolto ora; il problema persiste – zyndor