On Mon, 26 Nov 2007 05:34:43 -0800 (PST), meow :(et du coups je me
demande meme pourquoi ces fonctions sont déclarées amies), sauf pour
certains comme ==, !=, << où des champs privés sont accédés :/
Pour == et !=, as-tu une raison particulière pour préférer une
fonction non-membre amie à une fonction membre ?
On Mon, 26 Nov 2007 05:34:43 -0800 (PST), meow :
(et du coups je me
demande meme pourquoi ces fonctions sont déclarées amies), sauf pour
certains comme ==, !=, << où des champs privés sont accédés :/
Pour == et !=, as-tu une raison particulière pour préférer une
fonction non-membre amie à une fonction membre ?
On Mon, 26 Nov 2007 05:34:43 -0800 (PST), meow :(et du coups je me
demande meme pourquoi ces fonctions sont déclarées amies), sauf pour
certains comme ==, !=, << où des champs privés sont accédés :/
Pour == et !=, as-tu une raison particulière pour préférer une
fonction non-membre amie à une fonction membre ?
Pour == et !=, as-tu une raison particulière pour préférer u ne
fonction non-membre amie à une fonction membre ?
Comme toujours, l'assymétrie en présence de conversions implicites.
J'ai généralement un membre compare() et les opérateurs binaires de
comparaisons qui l'utilisent.
Pour == et !=, as-tu une raison particulière pour préférer u ne
fonction non-membre amie à une fonction membre ?
Comme toujours, l'assymétrie en présence de conversions implicites.
J'ai généralement un membre compare() et les opérateurs binaires de
comparaisons qui l'utilisent.
Pour == et !=, as-tu une raison particulière pour préférer u ne
fonction non-membre amie à une fonction membre ?
Comme toujours, l'assymétrie en présence de conversions implicites.
J'ai généralement un membre compare() et les opérateurs binaires de
comparaisons qui l'utilisent.
c'est juste que je lis et interragis avec ce newsgroup via le
portail google
c'est juste que je lis et interragis avec ce newsgroup via le
portail google
c'est juste que je lis et interragis avec ce newsgroup via le
portail google
N'as-tu pas la possibilité d'installer un vrai client NNTP ?
Hum, ce sont de vieux souvenirs mais Je crois que j'avais essayé ça au
N'as-tu pas la possibilité d'installer un vrai client NNTP ?
Hum, ce sont de vieux souvenirs mais Je crois que j'avais essayé ça au
N'as-tu pas la possibilité d'installer un vrai client NNTP ?
Hum, ce sont de vieux souvenirs mais Je crois que j'avais essayé ça au
Bonjour, et merci pour vos réponses. Avant de continuer, je tiens à
préciser que mes soucis sont inhérents à la reprise d'un vieux code
(bibliothèque de minimisation coool). Pour info, le fichier dans
lequel j'ai expérimenté les soucis exposés ici date de 1994 Si ça peut
aider...
@Fabien, c'est essentiellement l'emploi du template qui complique
tout ;)
@Kanze:Attention : ici, tu n'as pas déclaré une template comme ami,
mais une fonction non-template.
Euh, je t'avoues que je ne connais déjà pas cette notation avec les
chevrons vides :/
J'ai découvert récemment qu'on pouvait utiliser ce genre
d'écriture pour définir une implémentation particulière d'une
fonction ou d'une classe déclarée template et dont on souhaite
instancier les arguments template...
Selon la norme, je crois ce que tu veux, c'est :
friend A<T> operator+< A< T > >( A< T >, A< T > ) ;
J'ai essayé (dans mon cas A = Model et T=Type ), et gcc n'est toujou rs
pas content :
(Dans mon exemple j'ai
../../include/coool/Model.hh:226: error: template-id 'operator
+<Model<double> >' for 'Model<double> operator+(const Model<double>&,
const std::valarray<double>&)' does not match any template declaration
Cela étant, je ne comprends pas ton écriture, et de plus je ne
vois pas ce que cela donnerait pour les cas où j'ai des
arguments d'autres types que Model<Type>:
friend Model<Type> operator+<>(const Model<Type>&, const
Model<Type>&);
friend Model<Type> operator+<>(const Model<Type>&, const
std::valarray<Type>&);
friend Model<Type> operator+<>(const std::valarray<Type>&,
const Model<Type>&);
friend Model<Type> operator*<>(Type, const Model<Type>&);
Et puis il ne faudrait pas spécifier explicitement qu'on a qu'il
s'agit d'une fonction template, un truc du genre :
template<>
friend Model<Type> operator+<Type>(const Model<Type>&, const
std::valarray<Type>&);
(j'ai l'impression d'etre un singe savant... Avec un peu de chance je
réécrirai proust avant d'avoir réussi à faire compiler/fonctionner ma
bibliothèque)Seulement, dans ce cas-là, il faudrait une declaration du
template de la fonction avant la classe. Quelque chose du
genre :
En effet, c'est d'ailleurs le cas dans le fichier en question.
D'ailleurs, j'ai copié collé des sous parties un peu plus bas dans ce
message comme tu me l'avais demandé.Pour le cas des operator
arithmetiques binaires, par exemple, je fais quelque chose du
genre :
Le template de classe ArithmeticOperators s'occupe de générer un
operator+ (en tant que fonction libre) à partir de l'operator+=.
Tu veux dire que si dans mon cas je commentes les déclarations
et définitions des fonctions libres, le compilo sera assez
aimable pour m'en fournir automatiquement a partir des
operateurs operation= (+=, *=, ...) de classe ?
Est-ce que tu aurais un exemple du cas où tu as
l'avertissement ? Je m'y attendrais éventuellement pour ce que
tu as écrit ci-dessus.
ci dessous :
----------------------
//Model.hh
template <class Type>
class Model;
...
template <class Type>
Model<Type> operator+(const Model<Type>&, const Model<Type>&);
...
template <class Type>
class Model {
...
friend Model<Type> operator+<>(const Model<Type>&, const
Bonjour, et merci pour vos réponses. Avant de continuer, je tiens à
préciser que mes soucis sont inhérents à la reprise d'un vieux code
(bibliothèque de minimisation coool). Pour info, le fichier dans
lequel j'ai expérimenté les soucis exposés ici date de 1994 Si ça peut
aider...
@Fabien, c'est essentiellement l'emploi du template qui complique
tout ;)
@Kanze:
Attention : ici, tu n'as pas déclaré une template comme ami,
mais une fonction non-template.
Euh, je t'avoues que je ne connais déjà pas cette notation avec les
chevrons vides :/
J'ai découvert récemment qu'on pouvait utiliser ce genre
d'écriture pour définir une implémentation particulière d'une
fonction ou d'une classe déclarée template et dont on souhaite
instancier les arguments template...
Selon la norme, je crois ce que tu veux, c'est :
friend A<T> operator+< A< T > >( A< T >, A< T > ) ;
J'ai essayé (dans mon cas A = Model et T=Type ), et gcc n'est toujou rs
pas content :
(Dans mon exemple j'ai
../../include/coool/Model.hh:226: error: template-id 'operator
+<Model<double> >' for 'Model<double> operator+(const Model<double>&,
const std::valarray<double>&)' does not match any template declaration
Cela étant, je ne comprends pas ton écriture, et de plus je ne
vois pas ce que cela donnerait pour les cas où j'ai des
arguments d'autres types que Model<Type>:
friend Model<Type> operator+<>(const Model<Type>&, const
Model<Type>&);
friend Model<Type> operator+<>(const Model<Type>&, const
std::valarray<Type>&);
friend Model<Type> operator+<>(const std::valarray<Type>&,
const Model<Type>&);
friend Model<Type> operator*<>(Type, const Model<Type>&);
Et puis il ne faudrait pas spécifier explicitement qu'on a qu'il
s'agit d'une fonction template, un truc du genre :
template<>
friend Model<Type> operator+<Type>(const Model<Type>&, const
std::valarray<Type>&);
(j'ai l'impression d'etre un singe savant... Avec un peu de chance je
réécrirai proust avant d'avoir réussi à faire compiler/fonctionner ma
bibliothèque)
Seulement, dans ce cas-là, il faudrait une declaration du
template de la fonction avant la classe. Quelque chose du
genre :
En effet, c'est d'ailleurs le cas dans le fichier en question.
D'ailleurs, j'ai copié collé des sous parties un peu plus bas dans ce
message comme tu me l'avais demandé.
Pour le cas des operator
arithmetiques binaires, par exemple, je fais quelque chose du
genre :
Le template de classe ArithmeticOperators s'occupe de générer un
operator+ (en tant que fonction libre) à partir de l'operator+=.
Tu veux dire que si dans mon cas je commentes les déclarations
et définitions des fonctions libres, le compilo sera assez
aimable pour m'en fournir automatiquement a partir des
operateurs operation= (+=, *=, ...) de classe ?
Est-ce que tu aurais un exemple du cas où tu as
l'avertissement ? Je m'y attendrais éventuellement pour ce que
tu as écrit ci-dessus.
ci dessous :
----------------------
//Model.hh
template <class Type>
class Model;
...
template <class Type>
Model<Type> operator+(const Model<Type>&, const Model<Type>&);
...
template <class Type>
class Model {
...
friend Model<Type> operator+<>(const Model<Type>&, const
Bonjour, et merci pour vos réponses. Avant de continuer, je tiens à
préciser que mes soucis sont inhérents à la reprise d'un vieux code
(bibliothèque de minimisation coool). Pour info, le fichier dans
lequel j'ai expérimenté les soucis exposés ici date de 1994 Si ça peut
aider...
@Fabien, c'est essentiellement l'emploi du template qui complique
tout ;)
@Kanze:Attention : ici, tu n'as pas déclaré une template comme ami,
mais une fonction non-template.
Euh, je t'avoues que je ne connais déjà pas cette notation avec les
chevrons vides :/
J'ai découvert récemment qu'on pouvait utiliser ce genre
d'écriture pour définir une implémentation particulière d'une
fonction ou d'une classe déclarée template et dont on souhaite
instancier les arguments template...
Selon la norme, je crois ce que tu veux, c'est :
friend A<T> operator+< A< T > >( A< T >, A< T > ) ;
J'ai essayé (dans mon cas A = Model et T=Type ), et gcc n'est toujou rs
pas content :
(Dans mon exemple j'ai
../../include/coool/Model.hh:226: error: template-id 'operator
+<Model<double> >' for 'Model<double> operator+(const Model<double>&,
const std::valarray<double>&)' does not match any template declaration
Cela étant, je ne comprends pas ton écriture, et de plus je ne
vois pas ce que cela donnerait pour les cas où j'ai des
arguments d'autres types que Model<Type>:
friend Model<Type> operator+<>(const Model<Type>&, const
Model<Type>&);
friend Model<Type> operator+<>(const Model<Type>&, const
std::valarray<Type>&);
friend Model<Type> operator+<>(const std::valarray<Type>&,
const Model<Type>&);
friend Model<Type> operator*<>(Type, const Model<Type>&);
Et puis il ne faudrait pas spécifier explicitement qu'on a qu'il
s'agit d'une fonction template, un truc du genre :
template<>
friend Model<Type> operator+<Type>(const Model<Type>&, const
std::valarray<Type>&);
(j'ai l'impression d'etre un singe savant... Avec un peu de chance je
réécrirai proust avant d'avoir réussi à faire compiler/fonctionner ma
bibliothèque)Seulement, dans ce cas-là, il faudrait une declaration du
template de la fonction avant la classe. Quelque chose du
genre :
En effet, c'est d'ailleurs le cas dans le fichier en question.
D'ailleurs, j'ai copié collé des sous parties un peu plus bas dans ce
message comme tu me l'avais demandé.Pour le cas des operator
arithmetiques binaires, par exemple, je fais quelque chose du
genre :
Le template de classe ArithmeticOperators s'occupe de générer un
operator+ (en tant que fonction libre) à partir de l'operator+=.
Tu veux dire que si dans mon cas je commentes les déclarations
et définitions des fonctions libres, le compilo sera assez
aimable pour m'en fournir automatiquement a partir des
operateurs operation= (+=, *=, ...) de classe ?
Est-ce que tu aurais un exemple du cas où tu as
l'avertissement ? Je m'y attendrais éventuellement pour ce que
tu as écrit ci-dessus.
ci dessous :
----------------------
//Model.hh
template <class Type>
class Model;
...
template <class Type>
Model<Type> operator+(const Model<Type>&, const Model<Type>&);
...
template <class Type>
class Model {
...
friend Model<Type> operator+<>(const Model<Type>&, const
Oh, tant que j'y suis, je me rends compte qu'il y a deux petites
choses évoquées dans ce thread qui ne sont pas claires pour moi et que
je n'avais pas remarquées précédemment.
Dans le post de Kanze :template< typename T >
class A : public ArithmeticOperators< A< T > >
{
public
A& operator+=( A const& other ) ;
// ...
} ;
tu voulais dire A<T>& operator +=(A<T> const& other) ? Ou bien ton
ecriture est elle aussi valide ?
Et dans mon post, je me rends compte que je ne comprends pas le
fichier template.cc qui lève l'erreur :
#include "coool/Model.hh"
template class Model<double>;
C'est quoi cette utilisation du mot clef template ?
Et concrètement, qu'est-ce qu'on fait là ? a cette ligne ? Une
tentative de deviner : on déclare l'existence d'une classe
Model<double>, et on force ce faisant l'instantiation du
template par le compilo ?
Ou plus loin
template double std::min(const DiagMatrix<double>&m);
la présence du std me trouble...
j'ai bien trouvé une fonction libre min avec une signature
compatible dans le fichier DiagMatrix.cc, mais point de std...
Je suis dubitatif.
Oh, tant que j'y suis, je me rends compte qu'il y a deux petites
choses évoquées dans ce thread qui ne sont pas claires pour moi et que
je n'avais pas remarquées précédemment.
Dans le post de Kanze :
template< typename T >
class A : public ArithmeticOperators< A< T > >
{
public
A& operator+=( A const& other ) ;
// ...
} ;
tu voulais dire A<T>& operator +=(A<T> const& other) ? Ou bien ton
ecriture est elle aussi valide ?
Et dans mon post, je me rends compte que je ne comprends pas le
fichier template.cc qui lève l'erreur :
#include "coool/Model.hh"
template class Model<double>;
C'est quoi cette utilisation du mot clef template ?
Et concrètement, qu'est-ce qu'on fait là ? a cette ligne ? Une
tentative de deviner : on déclare l'existence d'une classe
Model<double>, et on force ce faisant l'instantiation du
template par le compilo ?
Ou plus loin
template double std::min(const DiagMatrix<double>&m);
la présence du std me trouble...
j'ai bien trouvé une fonction libre min avec une signature
compatible dans le fichier DiagMatrix.cc, mais point de std...
Je suis dubitatif.
Oh, tant que j'y suis, je me rends compte qu'il y a deux petites
choses évoquées dans ce thread qui ne sont pas claires pour moi et que
je n'avais pas remarquées précédemment.
Dans le post de Kanze :template< typename T >
class A : public ArithmeticOperators< A< T > >
{
public
A& operator+=( A const& other ) ;
// ...
} ;
tu voulais dire A<T>& operator +=(A<T> const& other) ? Ou bien ton
ecriture est elle aussi valide ?
Et dans mon post, je me rends compte que je ne comprends pas le
fichier template.cc qui lève l'erreur :
#include "coool/Model.hh"
template class Model<double>;
C'est quoi cette utilisation du mot clef template ?
Et concrètement, qu'est-ce qu'on fait là ? a cette ligne ? Une
tentative de deviner : on déclare l'existence d'une classe
Model<double>, et on force ce faisant l'instantiation du
template par le compilo ?
Ou plus loin
template double std::min(const DiagMatrix<double>&m);
la présence du std me trouble...
j'ai bien trouvé une fonction libre min avec une signature
compatible dans le fichier DiagMatrix.cc, mais point de std...
Je suis dubitatif.
On Mon, 26 Nov 2007 05:34:43 -0800 (PST), meow :(et du coups je me
demande meme pourquoi ces fonctions sont déclarées amies), sauf pour
certains comme ==, !=, << où des champs privés sont accédés :/
Pour == et !=, as-tu une raison particulière pour préférer une
fonction non-membre amie à une fonction membre ?
class A
{
public:
bool operator == (A const&) const;
};
Pour <<, généralement, on passe par une fonction membre
Print(ostream&).
Toutefois, commence par te demander si tu as
réellement besoin d'accéder à des membres privés. En effet, << a p our
rôle d'afficher à l'écran (ou autre ostream) l'état observable de
l'objet ; logiquement, toutes les données qu'il affiche devrait être
accessibles (au moins en lecture) par du code extérieur (i.e. via
l'interface publique).
On Mon, 26 Nov 2007 05:34:43 -0800 (PST), meow :
(et du coups je me
demande meme pourquoi ces fonctions sont déclarées amies), sauf pour
certains comme ==, !=, << où des champs privés sont accédés :/
Pour == et !=, as-tu une raison particulière pour préférer une
fonction non-membre amie à une fonction membre ?
class A
{
public:
bool operator == (A const&) const;
};
Pour <<, généralement, on passe par une fonction membre
Print(ostream&).
Toutefois, commence par te demander si tu as
réellement besoin d'accéder à des membres privés. En effet, << a p our
rôle d'afficher à l'écran (ou autre ostream) l'état observable de
l'objet ; logiquement, toutes les données qu'il affiche devrait être
accessibles (au moins en lecture) par du code extérieur (i.e. via
l'interface publique).
On Mon, 26 Nov 2007 05:34:43 -0800 (PST), meow :(et du coups je me
demande meme pourquoi ces fonctions sont déclarées amies), sauf pour
certains comme ==, !=, << où des champs privés sont accédés :/
Pour == et !=, as-tu une raison particulière pour préférer une
fonction non-membre amie à une fonction membre ?
class A
{
public:
bool operator == (A const&) const;
};
Pour <<, généralement, on passe par une fonction membre
Print(ostream&).
Toutefois, commence par te demander si tu as
réellement besoin d'accéder à des membres privés. En effet, << a p our
rôle d'afficher à l'écran (ou autre ostream) l'état observable de
l'objet ; logiquement, toutes les données qu'il affiche devrait être
accessibles (au moins en lecture) par du code extérieur (i.e. via
l'interface publique).