OVH Cloud OVH Cloud

Bug ou feature?

6 réponses
Avatar
nikolee
Bonjour,
j'ai un problème en essayant de compiler une application, je ne sais
pas si je fais une erreur mais voici le code incriminé :

Soient les deux classes suivantes :

namespace NS {

template <typename T1, typename T2>
class MERE: ANCETRE<T1,T2>
{
// ...
public:
// Unique constructeur
explicit
MERE(const unsigned char& d): ANCETRE<T1,T2>(d)
{ var=d; }
};

template <typename T1, typename T2>
class FILLE: MERE<T1,T2>
{
// ...
public:
// Unique constructeur
explicit
FILLE(const unsigned char& d): MERE<T1,T2>(d)
{ varFILLE=d; }
};

}

Or si j'instancie FILLE:

NS::FILLE<float,float> fifille(2);

quelque part dans mon programme, le compilateur (ici, GCC 3.2) renvoie
une erreur de compilation en disant:

Fichier.cxx:100 No matching function for call to
NS::FILLE<float,float>::FILLE()
Candidates are .. (le constructeur de copie, et le constructeur ci
dessus)

Je ne comprends pas, j'ai l'impression qu'il ne "voit" pas l'argument
que je passe au constructeur!? ("2")

Notez qu'aucune des deux classes n'est virtuelle, mais ANCETRE oui.
C'est pas un bug par hasard?

Merci pour toute aide!
Niko

6 réponses

Avatar
Gourgouilloult
niko wrote:
Bonjour,
j'ai un problème en essayant de compiler une application, je ne sais
pas si je fais une erreur mais voici le code incriminé :

Soient les deux classes suivantes :
[snip]
Or si j'instancie FILLE:

NS::FILLE<float,float> fifille(2);

quelque part dans mon programme, le compilateur (ici, GCC 3.2) renvoie
une erreur de compilation en disant:

Fichier.cxx:100 No matching function for call to
NS::FILLE<float,float>::FILLE()
Candidates are .. (le constructeur de copie, et le constructeur ci
dessus)

Je ne comprends pas, j'ai l'impression qu'il ne "voit" pas l'argument
que je passe au constructeur!? ("2")


Je ne comprends pas bien non plus. Est-ce que tu pourrais nous donner
plus de renseignement ? En particulier sur ta classe ANCETRE (beuh, un
identificateur tout en majuscules... pas bô ;). Concernant ton message
d'erreur : de quelle ligne s'agit-il au juste ? Aussi, il devrait
t'indiquer une série de messages "instantiated from here: ..." qui sont
généralement bien utiles.

Notez qu'aucune des deux classes n'est virtuelle, mais ANCETRE oui.
C'est pas un bug par hasard?


Pourrais-tu préciser ce que tu entends par là ? (Enfin, je ne crois pas
ce soit un terme en soi... quelqu'un peut-il éventuellement m'éclairer
?) Tu veux dire que ANCETRE a une fonction «juste» virtuelle, ou
virtuelle pure ? Dans le deuxième cas (je vais encore me décharger sur
plus sage que moi ;), je ne suis pas certain que
ANCETRE::ANCETRE(unsigned char const &) puisse être généré. Tu as
définis ce constructeur ? Mais bon, comme tu dis que c'est le ctor de
FILLE qui manque, ça m'a l'air d'une piste douteuse...

Merci pour toute aide!


En même temps, on ne fait que ce qu'on peut ;)

Niko


Gourgouilloult du Clapotis

Avatar
Niko
Le Tue, 14 Oct 2003 20:52:21 +0200, Gourgouilloult a écrit :

niko wrote:
Bonjour,
j'ai un problème en essayant de compiler une application, je ne sais
pas si je fais une erreur mais voici le code incriminé :

Soient les deux classes suivantes :
[snip]
Or si j'instancie FILLE:

NS::FILLE<float,float> fifille(2);

quelque part dans mon programme, le compilateur (ici, GCC 3.2) renvoie
une erreur de compilation en disant:

Fichier.cxx:100 No matching function for call to
NS::FILLE<float,float>::FILLE()
Candidates are .. (le constructeur de copie, et le constructeur ci
dessus)
Je ne comprends pas, j'ai l'impression qu'il ne "voit" pas l'argument
que je passe au constructeur!? ("2")
Je ne comprends pas bien non plus. Est-ce que tu pourrais nous donner

plus de renseignement ? En particulier sur ta classe ANCETRE (beuh, un
identificateur tout en majuscules... pas bô ;). Concernant ton message
d'erreur : de quelle ligne s'agit-il au juste ? Aussi, il devrait
t'indiquer une série de messages "instantiated from here: ..." qui sont
généralement bien utiles.


En fait, je ne fournis effectivement pas assez d'infos. Le code ci-dessus
(en rajoutant les commandes d'héritage :public parent) est en fait une
reprise de la partie de mon projet, donc c'est forcément pas bô!

Il se trouve que le problème (encore plus vague?)

est que:

Le compilateur se plaint de ne pas trouver un constructeur

MERE: ANCETRE<t1,t2>() {}

alors que mon implémentation ne l'utilise pas. Pour compiler quand même,
je l'ai défini aux côtés du premier

explicit
MERE: ANCETRE<t1,t2>(int) {}
MERE: ANCETRE<t1,t2>() {}

et ça compile.
Quand je débugge l'executable, il n'utilise *jamais* le constructeur pour
lequel il se plaignait.

Bref, je pense que le seul moyen de m'aider, c'est d'avoir eu le
problème! Merci,
Niko


Avatar
Plotark
MERE(const unsigned char& d): ANCETRE<T1,T2>(d)


Salut,

desole je ne reponds pas a ta question mais je voulais savoir les
avantages entre ce que tu ecris ci dessus et le simple
MERE(unsigned char d).

Merci par avance

Plotark

Avatar
Mathieu Peyréga
sur gcc 3.3.1 (portage mingw32) le code suivant compile et linke
parfaitement

namespace ns {

template <typename T1, typename T2>
class Ancetre
{
public:
explicit
Ancetre(const unsigned char d);
virtual ~Ancetre(void) = 0;
};

template <typename T1, typename T2>
Ancetre<T1,T2>::Ancetre(const unsigned char d)
{
}

template <typename T1, typename T2>
Ancetre<T1,T2>::~Ancetre(void)
{
}

template <typename T1, typename T2>
class Mere : Ancetre<T1,T2>
{
public:
explicit Mere(const unsigned char& d):Ancetre<T1,T2>(d)
{
var=d;
}

protected:
unsigned char var;
};

template <typename T1, typename T2>
class Fille : public Mere<T1,T2>
{
public:
explicit Fille(const unsigned char& d): Mere<T1,T2>(d)
{
varFille=d;
}

protected:
unsigned char varFille;
};

} // ns

int main(int argc, char* argv[])
{
ns::Fille<float,float> obj(2);
return 0;
}
Avatar
Christophe Lephay
Mathieu Peyréga wrote:
sur gcc 3.3.1 (portage mingw32) le code suivant compile et linke
parfaitement


Et il devrait pas ?

Chris

Avatar
kanze
"Christophe Lephay" wrote in message
news:<bmr8r0$agv$...
Mathieu Peyréga wrote:
sur gcc 3.3.1 (portage mingw32) le code suivant compile et linke
parfaitement


Et il devrait pas ?


Je ne vois pas pourquoi. C'est un exemple d'héritage on ne peut plus
classique.

Mais le posteur original nous a parlé d'un héritage virtuel (tout en
gardant secrèt où) -- si MERE hérite virtuellement de ANCETRE, le code
est illégal.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16