Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

correspondance définition/déclaration

7 réponses
Avatar
AG
Bonjour,

Mon compilo me renvoie l'erreur suivante :

monFichier.h : error C2244: 'maClass<T,ACS>::fwd' : impossible de
faire correspondre la définition de fonction avec une déclaration
existante.
monFichier.h : voir la déclaration de 'maClass<T,ACS>::fwd'
définition
'void maClass<T,ACS>::fwd(T::cum (*)[T::N_STATES],T::edge
(*)[T::N_SYMB_CODE],T::ext *)'
déclarations existantes
'void maClass<T,ACS>::fwd(T::cum (*)[T::N_STATES],T::edge
(*)[T::N_SYMB_CODE],T::ext *)'

(PS: ce n'est pas un copié collé mais j'ai vérifié 20 fois, c'est bien
la même signature qu'il m'affiche)

la class T est définie comme suit :

template<int N>
class mesTypes
{
public:
static const int N_STATES=8;
static const int N_SYMB_CODE=4;
typedef int ext;
typedef int cum;
....
static const int N_BITS=N+2;
....
};

et

template<class T, template<typename> ACS>
void maClass<T,ACS>::fwd(typename T::cum (*)[T::N_STATES],typename
T::edge (*)[T::N_SYMB_CODE],typename T::ext *);

j'ai pas le droit de faire des tableaux de taille T::N_STATES ou
T::N_SYMB_CODE dans ma fonction ? Ou j'ai la berlue ?

AG.

7 réponses

Avatar
AG
j'ai pas le droit de faire des tableaux de taille T::N_STATES ou
T::N_SYMB_CODE dans ma fonction ? Ou j'ai la berlue ?
Visiblement, lorsque j'enlève T::N_STATES ou T::N_SYMB_CODE, ça passe

à la compile.
D'ou ma question : comment fonctionne le mécanisme de compilation des
template ? A quelle moment le compilo connait la valeur de T::N_STATES
?

AG

Avatar
Fabien LE LEZ
On Fri, 20 Jul 2007 16:48:20 +0200, "AG" :

template<class T, template<typename> ACS>
void maClass<T,ACS>::fwd(typename T::cum (*)[T::N_STATES],typename
T::edge (*)[T::N_SYMB_CODE],typename T::ext *);


Si tu as ça dans ton code, le code est erroné.
En effet, ceci est une déclaration de fonction membre. Ce qui ne peut
se faire qu'à l'intérieur de la définition de la classe.

Par ailleurs, tu essaies de passer un tableau de pointeurs de
fonctions.
L'écriture du type d'un pointeur de fonction est abominable. C'est
pourquoi je conseille fortement d'utiliser un typedef :

typedef ... FonctionMachinTruc;

Enfin, un tableau "type C" n'étant guère plus qu'un pointeur, tu dois
pouvoir remplacer le tableau (dans la liste de paramètres de la
fonction fwd) par un pointeur. Un spécialiste du C peut confirmer ?

Mais puisque tu as un tableau, je me dois de poser la question que tu
as déjà dû te poser : as-tu une raison pour ne pas utiliser
std::vector<> ?

Avatar
Fabien LE LEZ

Par ailleurs, tu essaies de passer un tableau de pointeurs de
fonctions.


Euh... Finalement, non. Enfin, je ne crois pas.
C'est quoi le type "T::cum (*)[T::N_STATES]" exactement ?

Avatar
AG
Bonjour Fabien,

template<class T, template<typename> ACS>
void maClass<T,ACS>::fwd(typename T::cum (*)[T::N_STATES],typename
T::edge (*)[T::N_SYMB_CODE],typename T::ext *);


Si tu as ça dans ton code, le code est erroné.
En effet, ceci est une déclaration de fonction membre. Ce qui ne
peut
se faire qu'à l'intérieur de la définition de la classe.
oui, j'ai un peu modifier le message exact. Merci de préciser. En

l'occurence, j'ai bien mis la définition et la déclaration comme il
faut.


Par ailleurs, tu essaies de passer un tableau de pointeurs de
fonctions.
L'écriture du type d'un pointeur de fonction est abominable. C'est
pourquoi je conseille fortement d'utiliser un typedef :

typedef ... FonctionMachinTruc;


int (*)[] est le type d'un pointeur sur un tableau
int (*)[12] est le type d'un pointeur sur un tableau de 12 éléments.

si j'ai int tab[1230][12];

et que je veux passer ce tableau à une fonction, je passe un pointeur
sur le premier élément.
En l'occurence, le premier élément de ce talbeau est du type "tableau
de 12 éléments"

d'ou : int (*)[12]

ou si je veux lui donner un nom :

int (*ptr)[12]

Enfin, un tableau "type C" n'étant guère plus qu'un pointeur, tu
dois
pouvoir remplacer le tableau (dans la liste de paramètres de la
fonction fwd) par un pointeur. Un spécialiste du C peut confirmer ?
C'est ce que j'ai fait. Pour un tableau à deux dimension, tu dois

préciser la longueur de la deuxième dimension. (pour que lorsqu'on
fait ptr++, l'incrément se fasse bien de 12 int, j'imagine).

Mais puisque tu as un tableau, je me dois de poser la question que
tu
as déjà dû te poser : as-tu une raison pour ne pas utiliser
std::vector<> ?
Effectivement. En l'occurence, mon code est réinterprété par la suite,

et ce deuxième compilo ne parle pas encore la STL. (mais j'ai une
version du même code avec des vecteur, et c'est bô!)

AG.


Avatar
Fabien LE LEZ
On Fri, 20 Jul 2007 18:09:40 +0200, "AG" :

int (*)[] est le type d'un pointeur sur un tableau
int (*)[12] est le type d'un pointeur sur un tableau de 12 éléments.


Ah, oui, effectivement. Ça rappelle de vieux souvenirs...

Effectivement. En l'occurence, mon code est réinterprété par la suite,
et ce deuxième compilo ne parle pas encore la STL.


Au pire, n'as-tu pas moyen de faire ta propre classe "tableau à deux
dimensions" ?

Avatar
Fabien LE LEZ
On Fri, 20 Jul 2007 16:48:20 +0200, "AG" :

Mon compilo me renvoie l'erreur suivante :


Je t'invite à créer un bout de code, le plus court possible, qui
devrait compiler d'après toi, mais que le compilateur rejette.

Une fois que tu auras fait ça, il y a de bonnes chances pour que tu
aies compris toi-même d'où le problème vient.
Si ce n'est pas le cas, poste ce petit bout de code ici.

Avatar
James Kanze
On Jul 20, 5:49 pm, Fabien LE LEZ wrote:

Par ailleurs, tu essaies de passer un tableau de pointeurs de
fonctions.


Euh... Finalement, non. Enfin, je ne crois pas.
C'est quoi le type "T::cum (*)[T::N_STATES]" exactement ?


C'est un pointeur à un tableau de T::cum. C'est ce que tu as,
par exemple, quand un tableau à deux dimensions se transforme en
pointeur.

--
James Kanze (Gabi Software) email:
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