une classe possède un constructeur de copie et un opérateur de conversion
sur elle_même (ça paraît idiot mais il s'agit d'une redéfinition d'opérateur
virtuel donc obligatoire)
ClassA x;
ClassA y;
ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y
a ambiguîté entre la conversion de type et le constructeur de copie.
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
drkm
"Marc" writes:
une classe possède un constructeur de copie et un opérateur de conversion sur elle_même (ça paraît idiot mais il s'agit d'une redéfinition d'opérateur virtuel donc obligatoire)
La déclarer privée, sans l'implémenter, ne serait-il pas plus satisfaisant, dans ce cas (je ne connais pas tous les tenants et aboutissants) ?
// opérateur + redéfini Maintenant je fais
ClassA x; ClassA y; ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y a ambiguîté entre la conversion de type et le constructeur de copie.
Et avec :
Class z( x + y ) ;
?
--drkm
"Marc" <metrica@free.fr> writes:
une classe possède un constructeur de copie et un opérateur de conversion
sur elle_même (ça paraît idiot mais il s'agit d'une redéfinition d'opérateur
virtuel donc obligatoire)
La déclarer privée, sans l'implémenter, ne serait-il pas plus
satisfaisant, dans ce cas (je ne connais pas tous les tenants et
aboutissants) ?
// opérateur + redéfini
Maintenant je fais
ClassA x;
ClassA y;
ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y
a ambiguîté entre la conversion de type et le constructeur de copie.
une classe possède un constructeur de copie et un opérateur de conversion sur elle_même (ça paraît idiot mais il s'agit d'une redéfinition d'opérateur virtuel donc obligatoire)
La déclarer privée, sans l'implémenter, ne serait-il pas plus satisfaisant, dans ce cas (je ne connais pas tous les tenants et aboutissants) ?
// opérateur + redéfini Maintenant je fais
ClassA x; ClassA y; ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y a ambiguîté entre la conversion de type et le constructeur de copie.
Et avec :
Class z( x + y ) ;
?
--drkm
kanze
"Marc" wrote in message news:<417ec0e1$0$25701$...
J'ai un problème tout bête
une classe possède un constructeur de copie et un opérateur de conversion sur elle_même (ça paraît idiot mais il s'agit d'une redéfinition d'opérateur virtuel donc obligatoire)
ClassA x; ClassA y; ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y a ambiguîté entre la conversion de type et le constructeur de copie.
Ce qui me semble une erreur. La règle ici, c'est :
1. On évalue l'expression d'initialisation. 2. On le convertit en type voulu (c-à-d ici ClassA). 3. On appelle le constructeur de copie pour initialiser la variable.
Or, si l'opérateur + renvoie une ClassA, la conversion en 2 est triviale. On n'appelle pas un opérateur de conversion quand on a déjà le bon type. Et si l'opérateur + renvoie autre chose, il faut le convertir en ClassA -- la conversion ne doit pas être ambigüe, mais le constructeur de copie n'entre pas en jeu.
Ensuite, en 3, c'est le constructeur de copie qui entre en jeu. Et seulement le constructeur de copie -- rien d'autre. (Ensuite, le compilateur a le droit de supprimer la copie, s'il veut. Mais l'analyse de la légalité ne tient pas compte de cette suppression.)
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
"Marc" <metrica@free.fr> wrote in message
news:<417ec0e1$0$25701$636a15ce@news.free.fr>...
J'ai un problème tout bête
une classe possède un constructeur de copie et un opérateur de
conversion sur elle_même (ça paraît idiot mais il s'agit d'une
redéfinition d'opérateur virtuel donc obligatoire)
ClassA x;
ClassA y;
ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y
a ambiguîté entre la conversion de type et le constructeur de copie.
Ce qui me semble une erreur. La règle ici, c'est :
1. On évalue l'expression d'initialisation.
2. On le convertit en type voulu (c-à-d ici ClassA).
3. On appelle le constructeur de copie pour initialiser la variable.
Or, si l'opérateur + renvoie une ClassA, la conversion en 2 est
triviale. On n'appelle pas un opérateur de conversion quand on a déjà le
bon type. Et si l'opérateur + renvoie autre chose, il faut le convertir
en ClassA -- la conversion ne doit pas être ambigüe, mais le
constructeur de copie n'entre pas en jeu.
Ensuite, en 3, c'est le constructeur de copie qui entre en jeu. Et
seulement le constructeur de copie -- rien d'autre. (Ensuite, le
compilateur a le droit de supprimer la copie, s'il veut. Mais l'analyse
de la légalité ne tient pas compte de cette suppression.)
--
James Kanze GABI Software http://www.gabi-soft.fr
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
"Marc" wrote in message news:<417ec0e1$0$25701$...
J'ai un problème tout bête
une classe possède un constructeur de copie et un opérateur de conversion sur elle_même (ça paraît idiot mais il s'agit d'une redéfinition d'opérateur virtuel donc obligatoire)
ClassA x; ClassA y; ClassA z=x+y; // <------ et là ça va pas car mon compilo m'indique qu'il y a ambiguîté entre la conversion de type et le constructeur de copie.
Ce qui me semble une erreur. La règle ici, c'est :
1. On évalue l'expression d'initialisation. 2. On le convertit en type voulu (c-à-d ici ClassA). 3. On appelle le constructeur de copie pour initialiser la variable.
Or, si l'opérateur + renvoie une ClassA, la conversion en 2 est triviale. On n'appelle pas un opérateur de conversion quand on a déjà le bon type. Et si l'opérateur + renvoie autre chose, il faut le convertir en ClassA -- la conversion ne doit pas être ambigüe, mais le constructeur de copie n'entre pas en jeu.
Ensuite, en 3, c'est le constructeur de copie qui entre en jeu. Et seulement le constructeur de copie -- rien d'autre. (Ensuite, le compilateur a le droit de supprimer la copie, s'il veut. Mais l'analyse de la légalité ne tient pas compte de cette suppression.)
-- James Kanze GABI Software http://www.gabi-soft.fr Conseils en informatique orientée objet/ Beratung in objektorientierter Datenverarbeitung 9 place Sémard, 78210 St.-Cyr-l'École, France, +33 (0)1 30 23 00 34
Marc
Eh oui, il me semble bien que ce soit mon compilo qui déconne sur ce point... Effectivement, le type de retour de x+y n'est pas forcément ClassA dans mon cas, mais je ne comprends pas pourquoi il n'appelle pas dans tous les cas le constructeur de copie, éventuellement après une conversion... D'autant que je ne peux pas éviter le problème en redéfinissant l'opérateur =, qui lui n'est jamais appelé, comme il se doit... Tu sais pas si il y a des paramètrages de compilation sur ce point ? J'utilise C++ Builder 6... Marc
Eh oui, il me semble bien que ce soit mon compilo qui déconne sur ce
point...
Effectivement, le type de retour de x+y n'est pas forcément ClassA dans mon
cas, mais je ne comprends pas pourquoi il n'appelle pas dans tous les cas
le constructeur de copie, éventuellement après une conversion...
D'autant que je ne peux pas éviter le problème en redéfinissant l'opérateur
=, qui lui n'est jamais appelé, comme il se doit...
Tu sais pas si il y a des paramètrages de compilation sur ce point ?
J'utilise C++ Builder 6...
Marc
Eh oui, il me semble bien que ce soit mon compilo qui déconne sur ce point... Effectivement, le type de retour de x+y n'est pas forcément ClassA dans mon cas, mais je ne comprends pas pourquoi il n'appelle pas dans tous les cas le constructeur de copie, éventuellement après une conversion... D'autant que je ne peux pas éviter le problème en redéfinissant l'opérateur =, qui lui n'est jamais appelé, comme il se doit... Tu sais pas si il y a des paramètrages de compilation sur ce point ? J'utilise C++ Builder 6... Marc