Newsgroup: it.comp.lang.c++
Titolo: Funzioni friend : individuazione e visibilità ?

Per spiegarmi meglio cito da Stroustrup, 3a ed. p. 317 : par. 11.5.1
-------------------------------------------------------
Una funzione friend può essere dichiarata esplicitamente o può essere
individuata attraverso il tipo dei suoi argomenti come se fosse
dichiarata nel contesto non di classe che racchiude immediatamente la
sua classe. P. es. :
class Matrix { //...
	friend Matrix invert(const Matrix&);
	};
Matrix (*p)(const Matrix&) = &invert;  // errore, nessun invert() 
                                       // è visibile
void f(Matrix& m) {
	invert(m);	// invert() friend di Matrix
	}
Ne consegue che una funzione friend debba o essere dichiarata
esplicitamente in un contesto di visibilità che la racchiuda, oppure
accettare un argomento del tipo della sua classe.
Se così non è, la funzione friend non può essere invocata. P. es. :
void g();
class X {
	friend void g();		// friend di X
	friend void h(const X&);	// non può essere individuata 
					// attraverso i suoi argomenti
	};
-------------------------------------------------------
La domanda è :
perché dice che h() "non può essere individuata attraverso i suoi
argomenti" ?
Cos'ha di diverso da invert() di cui sopra ?
Se si scrivesse :
void f(X& x) {
	h(x);
	}
sarebbe allora sbagliato ?
Insomma, sono io che mi confondo o è un errore per cui il NON andrebbe
tolto ?
Grazie in anticipo per l'aiuto.

tolto ?
Nella mia copia (inglese) quel "non" e' assente.
Tieni pero' presente che la visibilita' delle
dichiarazioni friend e' una cosa un po' incasinata
e che attualmente ci sono al riguardo anche
problemi aperti per il comitato di standardizzazione.
Nota anche che oltre al libro dovresti controllare
le errata corrige... ad esempio proprio in quel
paragrafo la mia copia stampata contiene esempi
errati che sono stati successivamente corretti
(forse e' meglio dire che sono stati modificati ...
corretti e' un termine impegnativo :) )
Andrea

 Nella mia copia (inglese) quel "non" e' assente.
Oh, meno male, ti ringrazio perché cominciavo a essere confuso.
Se č cosě si tratta molto probabilmente di un errore di traduzione e\o
stampa.
Ehm... a parte gli errata corrige, visto che hai disponibile
l'edizione originale che io non ho, saresti cosě gentile da
trascrivermi cosa si legge esattamente allora invece di :
friend void h(const X&);	// non puň essere individuata 
				// attraverso i suoi argomenti
voglio dire, il testo inglese del commento cosa dice ?
Se me lo puoi fare, ti ringrazio molto.

Se me lo puoi fare, ti ringrazio molto.
  friend void h(const X&); // can be found through its argument
In pratica basta che togli il "non" dal tuo testo
in italiano e ottieni la traduzione ...
Nota che pero' in questo paragrafo su friend ho
trovato delle errata corrige relative alla prima
parte e non sono sicuro che non ce ne siano altre.
La ricerca sul sito di Stroustrup e' abbastanza
noiosa e io sono pigro di natura :)
Andrea

 parte e non sono sicuro che non ce ne siano altre.
Sì, certamente perfezionerò la ricerca degli errata corrige anche se
purtroppo dall'ed. it. non è così semplice come dice il sito di B.S.
risalire alla esatta individuazione della 11th printing piuttosto che
della 15th.
Ma intanto, grazie ancora perché quello che mi hai detto ha già
risolto il mio dubbio.
Tanto più che in
http://www.research.att.com/~bs/3rd_printing9.html
Chapt. 11 pg. 280
ho trovato questo esempio
void g(const X& x)
{
	f();	// no f() in scope
	h(x);	// X's friend h()
}
che corrisponde perfettamente al mio esempio che facevo nel primo
messaggio del 17 Agosto.
Ciao :)