Newsgroup: it.comp.lang.c++
Titolo: Passaggio di classi <vector> ad una funzione....

Ciao a tutti,
premessa: sto imparando :)
domanda: ho due classi, "Base" e "Derived" in cui la seconda deriva
dalla prima...
Se creo una funzione di tipo: void foo(vector<Base *> &pBase)
Quando provo a passare alla funzione un vettore di tipo:
vector<Derived *> Derived.
Ovvero invoco foo(Derived);
Ottengo questo tipo di errore:
error C2664: 'foo' :
cannot convert parameter 1 from
'class std::vector<class Derived *,class std::allocator<class Derived
*> >' to
'class std::vector<class Base *,class std::allocator<class Base *> >
&'
        A reference that is not to 'const' cannot be bound to a non-
lvalue
A questo punto se rendo const il parametro della funzione: void
foo(const vector<Base *> &pBase)
l'errore diventa:
error C2664: 'foo' :
cannot convert parameter 1 from
'class std::vector<class Derived *,class std::allocator<class Derived
*> >' to
'const class std::vector<class Base *,class std::allocator<class Base
*> > &'
Reason: cannot convert from
'class std::vector<class Derived *,class std::allocator<class Derived
*> >' to
'const class std::vector<class Base *,class std::allocator<class Base
*> >'
No constructor could take the source type, or constructor overload
resolution was ambiguous
Qualcuno mi può dare una spiegazione tecnica?
Quello che penso è che a tempo di compilazione non è possibile
stabilire il tipo degli oggetti utilizzati nei "vector" e quindi
genericamente non sono noti i costruttori che ci vorrebbero ovvero non
posso fare quello che tento di fare.
Oppure ho semplicemente omesso dettagli (o addirittura gli approriati
costruttori) per creare "copie" (costruttori di copia) tra oggetti
Base-Base Derivato-Base??
Grazie a tutti per questa domandina da venerdì pomeriggio. :)
Ciao!

 vector<Derived *> Derived.
Un reference (o un puntatore) a un 'vector<Derived*>' non può essere
convertito in un reference (o puntatore) a 'vector<Base*>'.
Se fosse possibile, all'interno di 'foo' tu potresti sostituire un elemento
del vector con un puntatore a un'istanza di una classe diversa da Derived
ma sempre derivata da 'Base'.
Max

 Base-Base Derivato-Base??
No, direi che non c'entri.
  bye
	av.

 forse no... Qualcun'altro si vuol fare avanti?
L'effetto che hai descritto sopra (e che ho descritto anch'io nella mia
risposta) non č il *motivo* per cui tale conversione non č possibile, č
solo un effetto disastroso che si avrebbe se fosse possbile.
Il vero motivo č che "vector<Base*>" e 'vector<Derived*>" sono tipi distinti
e non imparentati. Perciň non c'č nessuna regola del linguaggio che
consente tale conversione.
Tra l'altro, le implementazioni (quindi anche le strutture interne) possono
benissimo essere completamente diverse. Potrebbe, ad esempio, esistere una
specializzazione ad-hoc per uno dei due tipi.
Max

Ciao,
Diciamo che al motivo ci stavo arrivando ma non riuscivo a
formalizzarlo.
In pratica "mentre una classe derivata e pur sempre una classe base"
con un template non può essere la stessa cosa, pena la perdita del
controllo sul tipo. O sbaglio?
Per il resto, giusto due parole, Base e Derived li ho sostituiti ai
nomi originali perchè non volevo fuorviare le eventuali risposte con
dettagli del mio software (giusto perchè sto imparando, non volevo che
altri "errori" maggiorassero questo...:) )
Un'ultima nota sul vettore di puntatori, correggetemi se sbaglio.
Nel software che sto scrivendo, senza entrare troppo nel dettaglio, ho
una serie di elementi che da una parte sono per così dire "inclusi" in
altri, come le foglie di un albero (non nel senso informatico di
alberi) però ho necessità di catalogarli e rintracciarli nel software
quindi mi sembrava giusto usare dei puntatori per non fare troppe
copie degli stessi elementi.
Grazie!
Andrea Venturoli ha scritto:


 copie degli stessi elementi.
Ti ho solo fatto questa domanda, perche' mi sembrava il classico errore 
da principiante (come ho creduto di capire che tu sia dalla tua 
premessa). Detto questo, a volte puo' essere un'ottima soluzione e dalla 
tua descrizione potrebbe essere che sia uno di questi casi.
  bye
	av.