2010-09-22 6 views
3

Je ne peux pas comprendre quel est le problème réel avec ceci. Je reçois ce message d'erreur bizarre actor.cpp:31: error: using typedef-name ‘Actor’ after ‘class’.erreur: en utilisant typedef-name après la classe

Une idée de ce que j'ai mal fait ici? Merci :)

+1

Par ailleurs, l'artefact typedef-struct est utilisé uniquement dans C, où les noms de structure et les noms des autres types résident dans des espaces de noms différents (ne pas être destinés au sens C++); dans C++, les noms de structure et de classe peuvent être utilisés "normalement", donc l'idiome C-typedef n'est pas nécessaire. –

+2

Je vais sortir un membre et deviner que vous obtenez ces caractères dans le message d'erreur parce que vous utilisez mastic et devez définir l'option "Données reçues supposées être dans quel jeu de caractères" à UTF-8. –

Répondre

4

Vous n'êtes pas autorisé à définir le symbole Actor plusieurs fois. L'instruction typedef définit déjà le symbole Actor en tant qu'alias pour struct _actor avant de tenter de déclarer une classe portant le même nom.

Je suppose que vous utilisez le compilateur gcc. Je reçois les erreurs suivantes quand je compile avec gcc:

../src/main.cpp:113: error: using typedef-name ‘Actor’ after ‘class’ 
../src/main.cpp:111: error: ‘Actor’ has a previous declaration here 

Le premier message (pointant la ligne class Actor dans le programme) indique que vous ne pouvez pas déclarer une classe avec un typedef-name (Actor est déjà déclaré à l'aide typedef). Le deuxième message (pointant vers la ligne typedef struct _actor dans le programme) est un peu plus clair et fait référence aux multiples déclarations pour Actor.

Il est très courant en C/C++ qu'une seule classe d'erreur comme celle-ci entraîne plusieurs erreurs de compilation et souvent le message le plus utile n'est pas le premier signalé.

+0

pourriez-vous élaborer un peu? Je suis encore un peu nouveau à ça. – Bocochoco

+2

@Boco: Tout simplement, vous essayez de créer deux types différents avec le même nom. – UncleBens

+0

Merci :). Retrait du, Acteur à la fin semble avoir résolu ce problème. – Bocochoco

4

Pour comprendre ce qui se passe, il faut briser la première instruction en ses parties:

struct _actor 
{ 
    ... 
}; 

typedef struct _actor _actor; 
typedef struct _actor Actor; 

Tout d'abord, nous créons une structure appelée _actor. Ensuite, nous créons un typedef pour struct _actor appelé _actor. Ceci est seulement utile en C. Il nous permet de dire:

_actor myActor; 

au lieu de

struct _actor myActor; 

Mais en C++, il est inutile, comme C++ permet d'utiliser la première forme native, sans typedef .

La troisième ligne crée un deuxième typedef pour struct _actor appelé Actor. Lorsque vous essayez ensuite de créer une classe nommée Actor, le compilateur se plaint, car ce nom est déjà utilisé pour l'alias de la structure. Maintenant, il semble probable que dans le code C d'origine, l'auteur avait voulu struct _actor être simplement un détail d'implémentation, et que vous utiliseriez toujours juste Actor pour faire référence aux instances de cette structure. Par conséquent, dans votre code C++, vous devriez probablement éliminer complètement les typedefs, et simplement renommer la structure. Cependant, cela vous donnera:

struct Actor {.....} 
class Actor {.....} 

Donc, vous devriez peut-être envisager de fusionner ces deux classes.

0

pour arduino hectop imprimante 3D:

Renommer fpos_t variables dans SdBaseFile.h et SdBaseFile.cpp à un autre nom comme fpos_t1 et recompiler.

Questions connexes