friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(), déclarée plus
haut, est "amie" de la classe, i.e. peut accéder à tous ses membres.
Si la fonction en question n'a pas été déclarée préalablement, elle
est déclarée implicitement dans le namespace global (je crois).
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(), déclarée plus
haut, est "amie" de la classe, i.e. peut accéder à tous ses membres.
Si la fonction en question n'a pas été déclarée préalablement, elle
est déclarée implicitement dans le namespace global (je crois).
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(), déclarée plus
haut, est "amie" de la classe, i.e. peut accéder à tous ses membres.
Si la fonction en question n'a pas été déclarée préalablement, elle
est déclarée implicitement dans le namespace global (je crois).
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
Note que ce n'est pas forcément une forme conseillée.
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(),
déclarée plus haut,
est "amie" de la classe, i.e. peut accéder à tous ses >membres.
Si la fonction en question n'a pas été déclarée préalablement, elle
est déclarée implicitement dans le namespace global (je crois).
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
Note que ce n'est pas forcément une forme conseillée.
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(),
déclarée plus haut,
est "amie" de la classe, i.e. peut accéder à tous ses >membres.
Si la fonction en question n'a pas été déclarée préalablement, elle
est déclarée implicitement dans le namespace global (je crois).
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
Note que ce n'est pas forcément une forme conseillée.
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(),
déclarée plus haut,
est "amie" de la classe, i.e. peut accéder à tous ses >membres.
Si la fonction en question n'a pas été déclarée préalablement, elle
est déclarée implicitement dans le namespace global (je crois).
j'aimerai comprendre (dans le detail) cette declaration :
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
A) Est declaré dans maClass mais n'est pas une fonction membre de maCla ss.
B) Est declaré dans maClass avec le modificateur friend pour acceder a
chaques membres de maClass.
C) en ecrivant la declaration de cette facon, j'ai ajouté une nouvelle
declaration "de facon externe" de l'operator<< a la classe std::ostream?
Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
j'aimerai comprendre (dans le detail) cette declaration :
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
A) Est declaré dans maClass mais n'est pas une fonction membre de maCla ss.
B) Est declaré dans maClass avec le modificateur friend pour acceder a
chaques membres de maClass.
C) en ecrivant la declaration de cette facon, j'ai ajouté une nouvelle
declaration "de facon externe" de l'operator<< a la classe std::ostream?
Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
j'aimerai comprendre (dans le detail) cette declaration :
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
A) Est declaré dans maClass mais n'est pas une fonction membre de maCla ss.
B) Est declaré dans maClass avec le modificateur friend pour acceder a
chaques membres de maClass.
C) en ecrivant la declaration de cette facon, j'ai ajouté une nouvelle
declaration "de facon externe" de l'operator<< a la classe std::ostream?
Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
On Mon, 23 Oct 2006 14:31:45 +0200, Bruno CAUSSE :friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
Note que ce n'est pas forcément une forme conseillée.
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(), déclarée
plus haut, est "amie" de la classe, i.e. peut accéder à tous
ses membres.
Si la fonction en question n'a pas été déclarée préalablement,
elle est déclarée implicitement dans le namespace global (je
crois).
On Mon, 23 Oct 2006 14:31:45 +0200, Bruno CAUSSE <envoi@lesSpam.fr>:
friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
Note que ce n'est pas forcément une forme conseillée.
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(), déclarée
plus haut, est "amie" de la classe, i.e. peut accéder à tous
ses membres.
Si la fonction en question n'a pas été déclarée préalablement,
elle est déclarée implicitement dans le namespace global (je
crois).
On Mon, 23 Oct 2006 14:31:45 +0200, Bruno CAUSSE :friend std::ostream& operator<<(std::ostream& stream, const maClass& a);
Note que ce n'est pas forcément une forme conseillée.
La ligne
friend void f();
indique que la fonction libre (i.e. non membre) f(), déclarée
plus haut, est "amie" de la classe, i.e. peut accéder à tous
ses membres.
Si la fonction en question n'a pas été déclarée préalablement,
elle est déclarée implicitement dans le namespace global (je
crois).
Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
[...]Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
[...]
Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
[...]Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
dans l'article
, kanze à
a écrit le 23/10/06 16:45 :Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je suppose que ADL (Argument Dependent name Lookup) est une
résolution "a tiroir" de la signature. Mais de toute façon
trop avancé pour moi. A chaque fois que kanze me repond (merci
a lui) j'ai autant de questions que de reponses :-)
[...]Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sort ie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
Piges pas :(
il faut que je derive un ostream qui implemente une nouvelle fonction
ostream& operator<<(maClass& a) ?
dans l'article
1161614759.389978.260220@e3g2000cwe.googlegroups.com, kanze à
kanze@gabi-soft.fr a écrit le 23/10/06 16:45 :
Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je suppose que ADL (Argument Dependent name Lookup) est une
résolution "a tiroir" de la signature. Mais de toute façon
trop avancé pour moi. A chaque fois que kanze me repond (merci
a lui) j'ai autant de questions que de reponses :-)
[...]
Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sort ie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
Piges pas :(
il faut que je derive un ostream qui implemente une nouvelle fonction
ostream& operator<<(maClass& a) ?
dans l'article
, kanze à
a écrit le 23/10/06 16:45 :Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je suppose que ADL (Argument Dependent name Lookup) est une
résolution "a tiroir" de la signature. Mais de toute façon
trop avancé pour moi. A chaque fois que kanze me repond (merci
a lui) j'ai autant de questions que de reponses :-)
[...]Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sort ie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
Piges pas :(
il faut que je derive un ostream qui implemente une nouvelle fonction
ostream& operator<<(maClass& a) ?
dans l'article , kanze à
a écrit le 23/10/06 16:45 :Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je suppose que ADL (Argument Dependent name Lookup) est une résolution "a
tiroir" de la signature. Mais de toute façon trop avancé pour moi. A chaque
fois que kanze me repond (merci a lui) j'ai autant de questions que de
reponses :-)[...]Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
Piges pas :(
il faut que je derive un ostream qui implemente une nouvelle fonction
ostream& operator<<(maClass& a) ?
Pour lire et écrire un objet d'une classe on aimerait par exemple écrire:
dans l'article 1161614759.389978.260220@e3g2000cwe.googlegroups.com, kanze à
kanze@gabi-soft.fr a écrit le 23/10/06 16:45 :
Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je suppose que ADL (Argument Dependent name Lookup) est une résolution "a
tiroir" de la signature. Mais de toute façon trop avancé pour moi. A chaque
fois que kanze me repond (merci a lui) j'ai autant de questions que de
reponses :-)
[...]
Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
Piges pas :(
il faut que je derive un ostream qui implemente une nouvelle fonction
ostream& operator<<(maClass& a) ?
Pour lire et écrire un objet d'une classe on aimerait par exemple écrire:
dans l'article , kanze à
a écrit le 23/10/06 16:45 :Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je suppose que ADL (Argument Dependent name Lookup) est une résolution "a
tiroir" de la signature. Mais de toute façon trop avancé pour moi. A chaque
fois que kanze me repond (merci a lui) j'ai autant de questions que de
reponses :-)[...]Par la suite je souhaite declarer deux operateurs << (un pour ecrire
(binaire) dans un fichier, et l'autre pour ecrire (texte) dans la sortie
standard) est ce possible?
Bien sûr. L'un prend std::ostream& comme premier paramètre, est
l'autre une référence à ta classe pour écrire en binaire.
Piges pas :(
il faut que je derive un ostream qui implemente une nouvelle fonction
ostream& operator<<(maClass& a) ?
Pour lire et écrire un objet d'une classe on aimerait par exemple écrire:
Bruno CAUSSE wrote:dans l'article
, kanze à
a écrit le 23/10/06 16:45 :Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je l'aurais dit moi-même. Historiquement, il y avait un
trichement avec l'insertion du nom de friend ; je me rappelle
plus des détails (et ma copie de l'ARM est chez moi), mais en
fait, le compilateur trouvait les trois fonctions. C'est encore
le comportement du Sun CC 5.5 et du g++ 3.4.0.
Pendant la normalisation, cette injection a été supprimée, et à
la place, on a dit que l'ADL régarde dans les classes
impliquées. Je crois qu'on s'était bien rendu compte que le code
qui appelait foo(), ci-dessus, ne marcherait plus, mais il faut
avouer qu'une amie qui ne prend pas de paramètre apparenté à la
classe n'a généralement pas de sens.
Le cas du premier appel de bar est un peu plus subtile, en revanche,
et je ne sais pas si on l'a pris en compte.
Bruno CAUSSE wrote:
dans l'article
1161614759.389978.260220@e3g2000cwe.googlegroups.com, kanze à
kanze@gabi-soft.fr a écrit le 23/10/06 16:45 :
Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je l'aurais dit moi-même. Historiquement, il y avait un
trichement avec l'insertion du nom de friend ; je me rappelle
plus des détails (et ma copie de l'ARM est chez moi), mais en
fait, le compilateur trouvait les trois fonctions. C'est encore
le comportement du Sun CC 5.5 et du g++ 3.4.0.
Pendant la normalisation, cette injection a été supprimée, et à
la place, on a dit que l'ADL régarde dans les classes
impliquées. Je crois qu'on s'était bien rendu compte que le code
qui appelait foo(), ci-dessus, ne marcherait plus, mais il faut
avouer qu'une amie qui ne prend pas de paramètre apparenté à la
classe n'a généralement pas de sens.
Le cas du premier appel de bar est un peu plus subtile, en revanche,
et je ne sais pas si on l'a pris en compte.
Bruno CAUSSE wrote:dans l'article
, kanze à
a écrit le 23/10/06 16:45 :Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je l'aurais dit moi-même. Historiquement, il y avait un
trichement avec l'insertion du nom de friend ; je me rappelle
plus des détails (et ma copie de l'ARM est chez moi), mais en
fait, le compilateur trouvait les trois fonctions. C'est encore
le comportement du Sun CC 5.5 et du g++ 3.4.0.
Pendant la normalisation, cette injection a été supprimée, et à
la place, on a dit que l'ADL régarde dans les classes
impliquées. Je crois qu'on s'était bien rendu compte que le code
qui appelait foo(), ci-dessus, ne marcherait plus, mais il faut
avouer qu'une amie qui ne prend pas de paramètre apparenté à la
classe n'a généralement pas de sens.
Le cas du premier appel de bar est un peu plus subtile, en revanche,
et je ne sais pas si on l'a pris en compte.
"kanze" writes:Bruno CAUSSE wrote:dans l'article
, kanze à
a écrit le 23/10/06 16:45 :Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je l'aurais dit moi-même. Historiquement, il y avait un
trichement avec l'insertion du nom de friend ; je me rappelle
plus des détails (et ma copie de l'ARM est chez moi), mais en
fait, le compilateur trouvait les trois fonctions. C'est encore
le comportement du Sun CC 5.5 et du g++ 3.4.0.
(Gcc/g++ accèpte l'injection de nom friend jusqu'à 4.1.0 exclu)Pendant la normalisation, cette injection a été supprimée, et à
la place, on a dit que l'ADL régarde dans les classes
impliquées. Je crois qu'on s'était bien rendu compte que le code
qui appelait foo(), ci-dessus, ne marcherait plus, mais il faut
avouer qu'une amie qui ne prend pas de paramètre apparenté à la
classe n'a généralement pas de sens.
Je crois que l'intérêt principal de friend name injection, c'était
d'utiliser conjointement des classes templates. lorsque la classe
template était instanciée, les fonctions friend devenait alors
visible. On avait alors un contrôle de la visibilité de la fonction
friend, via l'instanciation -- même si celle-ci n'avait pas de
paramètres apparentés à la classe.
Le cas du premier appel de bar est un peu plus subtile, en
revanche, et je ne sais pas si on l'a pris en compte.
bar( 0 ); ? Si je ne m'abuse, le type de 0 est int, qui n'a pas de
namespace/classe scope associée. Je ne suis pas sur de saisir la
subtilité (?)
"kanze" <kanze@gabi-soft.fr> writes:
Bruno CAUSSE wrote:
dans l'article
1161614759.389978.260220@e3g2000cwe.googlegroups.com, kanze à
kanze@gabi-soft.fr a écrit le 23/10/06 16:45 :
Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je l'aurais dit moi-même. Historiquement, il y avait un
trichement avec l'insertion du nom de friend ; je me rappelle
plus des détails (et ma copie de l'ARM est chez moi), mais en
fait, le compilateur trouvait les trois fonctions. C'est encore
le comportement du Sun CC 5.5 et du g++ 3.4.0.
(Gcc/g++ accèpte l'injection de nom friend jusqu'à 4.1.0 exclu)
Pendant la normalisation, cette injection a été supprimée, et à
la place, on a dit que l'ADL régarde dans les classes
impliquées. Je crois qu'on s'était bien rendu compte que le code
qui appelait foo(), ci-dessus, ne marcherait plus, mais il faut
avouer qu'une amie qui ne prend pas de paramètre apparenté à la
classe n'a généralement pas de sens.
Je crois que l'intérêt principal de friend name injection, c'était
d'utiliser conjointement des classes templates. lorsque la classe
template était instanciée, les fonctions friend devenait alors
visible. On avait alors un contrôle de la visibilité de la fonction
friend, via l'instanciation -- même si celle-ci n'avait pas de
paramètres apparentés à la classe.
Le cas du premier appel de bar est un peu plus subtile, en
revanche, et je ne sais pas si on l'a pris en compte.
bar( 0 ); ? Si je ne m'abuse, le type de 0 est int, qui n'a pas de
namespace/classe scope associée. Je ne suis pas sur de saisir la
subtilité (?)
"kanze" writes:Bruno CAUSSE wrote:dans l'article
, kanze à
a écrit le 23/10/06 16:45 :Plus ou moins. La declaration n'a pas de visibilité global. Si
donc j'écris :
class Doh
{
friend void foo() ;
friend void bar( Doh* ) ;
} ;
int main()
{
foo() ;
bar( 0 ) ;
bar( (Doh*)0 ) ;
return 0 ;
}
le compilateur trouve bar dans le deuxième appel, à cause de
ADL, mais ne trouve pas la fonction dans des deux autres appels.
Comment la fonction libre foo() declaré dans Doh peut etre atteinte?
Impossible?
Je l'aurais dit moi-même. Historiquement, il y avait un
trichement avec l'insertion du nom de friend ; je me rappelle
plus des détails (et ma copie de l'ARM est chez moi), mais en
fait, le compilateur trouvait les trois fonctions. C'est encore
le comportement du Sun CC 5.5 et du g++ 3.4.0.
(Gcc/g++ accèpte l'injection de nom friend jusqu'à 4.1.0 exclu)Pendant la normalisation, cette injection a été supprimée, et à
la place, on a dit que l'ADL régarde dans les classes
impliquées. Je crois qu'on s'était bien rendu compte que le code
qui appelait foo(), ci-dessus, ne marcherait plus, mais il faut
avouer qu'une amie qui ne prend pas de paramètre apparenté à la
classe n'a généralement pas de sens.
Je crois que l'intérêt principal de friend name injection, c'était
d'utiliser conjointement des classes templates. lorsque la classe
template était instanciée, les fonctions friend devenait alors
visible. On avait alors un contrôle de la visibilité de la fonction
friend, via l'instanciation -- même si celle-ci n'avait pas de
paramètres apparentés à la classe.
Le cas du premier appel de bar est un peu plus subtile, en
revanche, et je ne sais pas si on l'a pris en compte.
bar( 0 ); ? Si je ne m'abuse, le type de 0 est int, qui n'a pas de
namespace/classe scope associée. Je ne suis pas sur de saisir la
subtilité (?)