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
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
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ a écrit:
On Mon, 16 Nov 2009 19:44:57 +0100, TSalm :
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 :-(
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ <gramster@gramster.com>
a écrit:
On Mon, 16 Nov 2009 19:44:57 +0100, TSalm <tsalm@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 :-(
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ a écrit:
On Mon, 16 Nov 2009 19:44:57 +0100, TSalm :
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
Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a écrit (dans <news:, posté dans fr.comp.lang.c++) :
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ 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
-- ___________ _/ _ _`_`_`_) 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
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 <gramster@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
--
___________
_/ _ _`_`_`_) 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
Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a écrit (dans <news:, posté dans fr.comp.lang.c++) :
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ 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
-- ___________ _/ _ _`_`_`_) 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
Le Mon, 16 Nov 2009 20:16:01 +0100, Serge Paccalin a écrit:
Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a écrit (dans <news:, posté dans fr.comp.lang.c++) :
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ
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
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 ?
Le Mon, 16 Nov 2009 20:16:01 +0100, Serge Paccalin
<sp@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
<gramster@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
Le Mon, 16 Nov 2009 20:16:01 +0100, Serge Paccalin a écrit:
Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a écrit (dans <news:, posté dans fr.comp.lang.c++) :
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ
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
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
Le Mon, 16 Nov 2009 20:34:44 +0100, TSalm a écrit (dans <news:, posté dans fr.comp.lang.c++) :
Le Mon, 16 Nov 2009 20:16:01 +0100, Serge Paccalin a écrit:
Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a écrit (dans <news:, posté dans fr.comp.lang.c++) :
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ
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
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
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
<sp@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
<gramster@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
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
Le Mon, 16 Nov 2009 20:34:44 +0100, TSalm a écrit (dans <news:, posté dans fr.comp.lang.c++) :
Le Mon, 16 Nov 2009 20:16:01 +0100, Serge Paccalin a écrit:
Le Mon, 16 Nov 2009 20:07:46 +0100, TSalm a écrit (dans <news:, posté dans fr.comp.lang.c++) :
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ
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
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
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> {
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
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>:
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 ».
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
On Nov 16, 7:07 pm, TSalm wrote:
Le Mon, 16 Nov 2009 19:54:05 +0100, Fabien LE LEZ a écrit:
> 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
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>:
> 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.
> 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.