Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Héritage d'une classe template

1 view
Skip to first unread message

TSalm

unread,
Nov 16, 2009, 1:44:57 PM11/16/09
to
Bonjour,

J'ai une classe template comme ceci :

template <class T> class SDbFile
{
...
bool read(T& el);
...
};

J'hᅵrite de cette classe :
class DukBinReader : public SDbFile<DukBinFormat_BigEndian>
{
...
bool read(DukBinFormat_BigEndian& dta)
{
// Quelques opᅵrations
...
// J'appel la mᅵthode de SDbFile, mais cette ligne
// gᅵnᅵre une erreur de compilation :
SDbFile::read<DukBinFormat_BigEndian>( dukIn );

...
}
};

Voilᅵ. Mon problᅵme est dans le commantaire :
SDbFile::read<DukBinFormat_BigEndian>( dukIn );
me gᅵnᅵre une erreur ᅵ la compilation avec MinGW :
error: `template<class T> class seqdb::SDbFile' used without template
parameters

Comment appeler la mᅵthode de ma classe mᅵre ?

D'avance merci pour votre aide.
-TSalm

Fabien LE LEZ

unread,
Nov 16, 2009, 1:54:05 PM11/16/09
to
On Mon, 16 Nov 2009 19:44:57 +0100, TSalm <ts...@free.fr>:

> template <class T> class SDbFile
> {
> ...
> bool read(T& el);

Donc, SDbFile est une classe template, et read est une fonction
normale.

> SDbFile::read<DukBinFormat_BigEndian>( dukIn );

L�, tu as invers� les r�les : tu fais comme si SDbFile �tait une
classe normale, et read une fonction template.

Il faut au contraire �crire :

SDbFile<DukBinFormat_BigEndian>::read (

TSalm

unread,
Nov 16, 2009, 2:07:46 PM11/16/09
to
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ <gram...@gramster.com>
a ᅵcrit:

> On Mon, 16 Nov 2009 19:44:57 +0100, TSalm <ts...@free.fr>:
>
>> template <class T> class SDbFile
>> {
>> ...
>> bool read(T& el);
>
> Donc, SDbFile est une classe template, et read est une fonction
> normale.
>
>> SDbFile::read<DukBinFormat_BigEndian>( dukIn );
>

> Lᅵ, tu as inversᅵ les rᅵles : tu fais comme si SDbFile ᅵtait une


> classe normale, et read une fonction template.
>

> Il faut au contraire ᅵcrire :
>
> SDbFile<DukBinFormat_BigEndian>::read (

Non. C'est aussi un essai que j'ai fait, mais mon compilateur me retourne :
error: cannot call member function `bool
seqdb::SDbFile<T>::read(T&) [with T = DukBinFormat_BigEndian]' without
object

J'ai mᅵme essayᅵ :
SDbFile<DukBinFormat_BigEndian>::read<DukBinFormat_BigEndian>( dukIn )
qui me retourne :
error: invalid use of non-static member function `bool
seqdb::SDbFile<T>::read(T&) [with T = DukBinFormat_BigEndian]'

En tout cas, sur mon compilateur(MinGW), ᅵa ne passe pas :-(

Serge Paccalin

unread,
Nov 16, 2009, 2:16:01 PM11/16/09
to
Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a �crit
(dans�<news:op.u3h4q8cmk9rspk@papillon>, post� dans�fr.comp.lang.c++)�:

> Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ <gram...@gramster.com>

> a �crit:


>
>>
>>> SDbFile::read<DukBinFormat_BigEndian>( dukIn );
>>

>> Il faut au contraire �crire :
>>

>> SDbFile<DukBinFormat_BigEndian>::read (
>
> Non. C'est aussi un essai que j'ai fait, mais mon compilateur me retourne :
> error: cannot call member function `bool
> seqdb::SDbFile<T>::read(T&) [with T = DukBinFormat_BigEndian]' without
> object

Et comme �a�?

this->SDbFile<DukBinFormat_BigEndian>::read(dukIn);

--
___________
_/ _ \_`_`_`_) Serge PACCALIN -- sp ad mailclub.net
\ \_L_) Il faut donc que les hommes commencent
-'(__) par n'�tre pas fanatiques pour m�riter
_/___(_) la tol�rance. -- Voltaire, 1763

TSalm

unread,
Nov 16, 2009, 2:34:44 PM11/16/09
to
Le Mon, 16 Nov 2009 20:16:01 +0100, Serge Paccalin
<s...@mailclub.no.spam.net> a ᅵcrit:

> Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a ᅵcrit
> (dansᅵ<news:op.u3h4q8cmk9rspk@papillon>, postᅵ dansᅵfr.comp.lang.c++)ᅵ:


>
>> Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ
>> <gram...@gramster.com>

>> a ᅵcrit:


>>
>>>
>>>> SDbFile::read<DukBinFormat_BigEndian>( dukIn );
>>>

>>> Il faut au contraire ᅵcrire :


>>>
>>> SDbFile<DukBinFormat_BigEndian>::read (
>>
>> Non. C'est aussi un essai que j'ai fait, mais mon compilateur me
>> retourne :
>> error: cannot call member function `bool
>> seqdb::SDbFile<T>::read(T&) [with T = DukBinFormat_BigEndian]' without
>> object
>

> Et comme ᅵaᅵ?
>
> this->SDbFile<DukBinFormat_BigEndian>::read(dukIn);
>

Non plus, j'ai l'erreur :
error: invalid use of `this' in non-member function

Ca vient de mon compilateur? Ca fonctionne sur vos compilateur ?

Serge Paccalin

unread,
Nov 16, 2009, 2:55:12 PM11/16/09
to
Le Mon, 16 Nov 2009 20:34:44 +0100, TSalm a écrit
(dans <news:op.u3h5z6j4k9rspk@papillon>, posté dans fr.comp.lang.c++) :

> Le Mon, 16 Nov 2009 20:16:01 +0100, Serge Paccalin

> <s...@mailclub.no.spam.net> a écrit:
>
>> Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a écrit
>> (dans <news:op.u3h4q8cmk9rspk@papillon>, posté dans fr.comp.lang.c++) :


>>
>>> Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ
>>> <gram...@gramster.com>

>>> a écrit:


>>>
>>>>
>>>>> SDbFile::read<DukBinFormat_BigEndian>( dukIn );
>>>>

>>>> Il faut au contraire écrire :


>>>>
>>>> SDbFile<DukBinFormat_BigEndian>::read (
>>>
>>> Non. C'est aussi un essai que j'ai fait, mais mon compilateur me
>>> retourne :
>>> error: cannot call member function `bool
>>> seqdb::SDbFile<T>::read(T&) [with T = DukBinFormat_BigEndian]' without
>>> object
>>

>> Et comme ça ?


>>
>> this->SDbFile<DukBinFormat_BigEndian>::read(dukIn);
>>
>
> Non plus, j'ai l'erreur :
> error: invalid use of `this' in non-member function

Donc, la fonction appelante n'est pas une fonction membre d'une classe,
contrairement à ce que laisse supposer le bout de code que tu as publié…
Elle ne serait pas statique, par hasard ?



> Ca vient de mon compilateur? Ca fonctionne sur vos compilateur ?

On n'a pas le code complet, nous.

--
___________
_/ _ \_`_`_`_) Serge PACCALIN -- sp ad mailclub.net
\ \_L_) Il faut donc que les hommes commencent

-'(__) par n'être pas fanatiques pour mériter
_/___(_) la tolérance. -- Voltaire, 1763

Fabien LE LEZ

unread,
Nov 16, 2009, 3:01:30 PM11/16/09
to
Le code ci-dessous est correct :

template <class T> class SDbFile
{

public:
bool read(T& el);

};

class DukBinFormat_BigEndian { };

class DukBinReader : public SDbFile<DukBinFormat_BigEndian>
{

bool read(DukBinFormat_BigEndian& dukIn)
{
return SDbFile<DukBinFormat_BigEndian>::read( dukIn );
}
};

(Test� avec g++ 4.1.2)

Fabien LE LEZ

unread,
Nov 16, 2009, 3:05:13 PM11/16/09
to
On Mon, 16 Nov 2009 20:16:01 +0100, Serge Paccalin
<s...@mailclub.no.spam.net>:

> this->

� ma connaissance, le "this->" n'a pas d'utilit� si on pr�cise le nom
de la classe.

TSalm

unread,
Nov 16, 2009, 3:41:32 PM11/16/09
to
Le Mon, 16 Nov 2009 21:01:30 +0100, Fabien LE LEZ <gram...@gramster.com>
a ᅵcrit:

> Le code ci-dessous est correct :

> (Testᅵ avec g++ 4.1.2)
>


Je viens de trouver et je dois dire que j'ai profondemment honte :-)
En vᅵritᅵ, je l'avais dᅵclarᅵ comme ceci :

Dans mon fichier .hpp :


class DukBinReader : public SDbFile<DukBinFormat_BigEndian>
{

bool read(DukBinFormat_BigEndian& dukIn);
}

Et dans mon .cpp :
bool read(DukBinFormat_BigEndian& dukIn)
{
// Ce que vous savez, dᅵsolᅵ pour la question idiote !
}

James Kanze

unread,
Nov 17, 2009, 3:47:00 AM11/17/09
to
On Nov 16, 6:54 pm, Fabien LE LEZ <grams...@gramster.com> wrote:
> On Mon, 16 Nov 2009 19:44:57 +0100, TSalm <ts...@free.fr>:

> > template <class T> class SDbFile
> > {
> > ...
> > bool read(T& el);

> Donc, SDbFile est une classe template, et read est une
> fonction normale.

Juste un détail de vocabulaire (et je ne suis pas trop sûr
comment faire la distinction en français) : SDbFile est un
template (de classe), non une classe. Ce n'est que ses
instantiations qui sont des classes : SDbFile< MaClasse >, etc.

(En anglais, où le modificateur précède toujours le modifié, on
insiste que c'est un « class template », et non un « template
class ». En français, où l'ordre est un peu plus souple, je ne
sais pas exactement ce qu'il faudrait dire : « template de
classe », peut-être. Mais j'ai toujours entendu dire « classe
générique », quand on discutait le vocabulaire, et « classe
template » ou « classe templatée » semblent courantes.)

> > SDbFile::read<DukBinFormat_BigEndian>( dukIn );

> Là, tu as inversé les rôles : tu fais comme si SDbFile était


> une classe normale, et read une fonction template.

> Il faut au contraire écrire :

> SDbFile<DukBinFormat_BigEndian>::read (

Ou simplement « read( », si la classe dérivée n'a pas de
fonction « read ».

--
James Kanze

James Kanze

unread,
Nov 17, 2009, 3:53:42 AM11/17/09
to
On Nov 16, 7:07 pm, TSalm <ts...@free.fr> wrote:
> Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ
> <grams...@gramster.com> a écrit:

> > On Mon, 16 Nov 2009 19:44:57 +0100, TSalm <ts...@free.fr>:

> >> template <class T> class SDbFile
> >> {
> >> ...
> >> bool read(T& el);

> > Donc, SDbFile est une classe template, et read est une
> > fonction normale.

> >> SDbFile::read<DukBinFormat_BigEndian>( dukIn );

> > Là, tu as inversé les rôles : tu fais comme si SDbFile était


> > une classe normale, et read une fonction template.

> > Il faut au contraire écrire :

> > SDbFile<DukBinFormat_BigEndian>::read (

> Non. C'est aussi un essai que j'ai fait, mais mon compilateur
> me retourne :
> error: cannot call member function `bool
> seqdb::SDbFile<T>::read(T&) [with T = DukBinFormat_BigEndian]' without
> object

Alors, tu ne nous montres pas le vrai code qui a provoqué
l'erreur. Ce message, tu le vois quand tu essaies d'appeler la
fonction, et soit tu n'es pas dans un membre (de la classe ou
d'une classe dérivée, soit tu es dans un membre d'un template de
classe qui en dérive, et que la classe de base est un nom
dépendant.

> J'ai même essayé :


> SDbFile<DukBinFormat_BigEndian>::read<DukBinFormat_BigEndian>( dukIn )
> qui me retourne :
> error: invalid use of non-static member function `bool
> seqdb::SDbFile<T>::read(T&) [with T = DukBinFormat_BigEndian]'

Essayer d'une façon aléatoire, sans comprendre, n'apporte rien.
Le mieux, c'est que tu postes un petit exemple complet (qu'on
peut essayer nous même) qui montre le problème. Et que tu
essaies de comprendre le message d'erreur, et te poses la
question : pourquoi le compilateur l'a émis. S'il dit « cannot
call member fonction without object », c'est qu'il ne trouve pas
d'objet de type SDbFile< DukBinFormat_BigEndian > dans
l'expression.

--
James Kanze

TSalm

unread,
Nov 17, 2009, 6:42:47 AM11/17/09
to
>> J'ai mᅵme essayᅵ :
>> SDbFile<DukBinFormat_BigEndian>::read<DukBinFormat_BigEndian>(
>> dukIn )
>> qui me retourne :
>> error: invalid use of non-static member function `bool
>> seqdb::SDbFile<T>::read(T&) [with T = DukBinFormat_BigEndian]'
>
> Essayer d'une faᅵon alᅵatoire, sans comprendre, n'apporte rien.

> Le mieux, c'est que tu postes un petit exemple complet (qu'on
> peut essayer nous mᅵme) qui montre le problᅵme. Et que tu

> essaies de comprendre le message d'erreur, et te poses la
> questionᅵ: pourquoi le compilateur l'a ᅵmis. S'il dit ᅵᅵcannot
> call member fonction without objectᅵᅵ, c'est qu'il ne trouve pas

> d'objet de type SDbFile< DukBinFormat_BigEndian > dans
> l'expression.

Oui, c'ᅵtait exactement ᅵa : une stupide erreur de ma part (cf mon post
prᅵcᅵdent)

TSalm

unread,
Nov 17, 2009, 6:45:19 AM11/17/09
to
Merci pour cette clarification.
Je ne savais justement pas trop, j'ai mᅵme failli mettre << classe
templatᅵe >>, mais ᅵa sonnait vraiment franglais :-)


>> > template <class T> class SDbFile
>> > {
>> > ...
>> > bool read(T& el);
>
>> Donc, SDbFile est une classe template, et read est une
>> fonction normale.
>

> Juste un dᅵtail de vocabulaire (et je ne suis pas trop sᅵr
> comment faire la distinction en franᅵais) : SDbFile est un


> template (de classe), non une classe. Ce n'est que ses
> instantiations qui sont des classes : SDbFile< MaClasse >, etc.
>

> (En anglais, oᅵ le modificateur prᅵcᅵde toujours le modifiᅵ, on
> insiste que c'est un ᅵᅵclass templateᅵᅵ, et non un ᅵᅵtemplate
> classᅵᅵ. En franᅵais, oᅵ l'ordre est un peu plus souple, je ne
> sais pas exactement ce qu'il faudrait direᅵ: ᅵᅵtemplate de
> classeᅵᅵ, peut-ᅵtre. Mais j'ai toujours entendu dire ᅵᅵclasse
> gᅵnᅵriqueᅵᅵ, quand on discutait le vocabulaire, et ᅵᅵclasse
> templateᅵᅵ ou ᅵᅵclasse templatᅵeᅵᅵ semblent courantes.)

0 new messages