2010-11-28 6 views
3

Il est une question bien connu cette erreur sacrémentImpossible nom de classe attendue avant « { » erreur jeton pour résoudre

nom de classe attendue avant « { » jeton

Eh bien, malgré mon travail dur et googler, Je n'ai pas pu résoudre cette erreur. Pardon. C'est ma dernière rive.

Dans ui.cpp d'un de mes projets que je fais:

#include "wfqueue_proxy_factory.hpp" 

OK, cela soulève cette erreur stupide dans mon compilateur:

In file included from wfqueue_proxy_factory.hpp:29,from ui.cpp:28: wfqueue_manager_proxy.hpp:42: error: expected class-name before ‘{’ token

Il y a trois classes dans mon projet: Tout d'abord

// wfqueue_proxy_factory.hpp 
#ifndef _WFQUEUE_PROXY_FACTORY_HPP 
#define _WFQUEUE_PROXY_FACTORY_HPP 
#include "wfqueue_manager_proxy.hpp" 
// ... 
class WFQueueProxyFactory { 
//... 
}; 
#endif 

Deuxième

// wfqueue_manager_proxy.hpp 
#ifndef _WFQUEUE_MANAGER_PROXY_HPP 
#define _WFQUEUE_MANAGER_PROXY_HPP 
#include "workflow.hpp" 
#include "wfqueue.hpp" 
// ... 
class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42) 
//... 
}; 
#endif 

Troisième

// wfqueue.hpp 
#ifndef _WFQUEUE_HPP 
#define _WFQUEUE_HPP 
#include "workflow.hpp" 
class WFQueue { 
// ... 
}; 
#endif 

S'IL VOUS PLAÎT S'IL VOUS PLAÎT S'IL VOUS PLAÎT noter que je l'utilise; après} de chaque classe, j'ai vérifié CHAQUE entête dans mon projet recherchant ce problème et n'ai trouvé aucune classe non suivie par; après son crochet de fermeture. Ceci est valable pour workflow.hpp qui est une classe simple (ne dérivant d'aucune classe, juste une classe ordinaire).

WFQueue est une sorte si l'interface, j'utilise ce modèle avec d'autres classes aussi et ils fonctionnent. WFQueue contient des méthodes virtuelles pures ... problème ne devrait pas être ici de toute façon .... Je suppose que cela parce que j'utilise une autre classe "interface" avec d'autres classes et ils fonctionnent bien.

Cette erreur disparaît si je fais ceci:

// wfqueue_manager_proxy.hpp 
#ifndef _WFQUEUE_MANAGER_PROXY_HPP 
#define _WFQUEUE_MANAGER_PROXY_HPP 
#include "workflow.hpp" 
#include "wfqueue.hpp" 
// ... 
class WFQueueManagerProxy { 
//... 
}; 
#endif 

Je ne sais pas vraiment comment résoudre ce problème ... s'il vous plaît aidez-moi. Merci

+0

Peut-être que je l'ai manqué, mais je ne vois rien de mal avec le code que vous avez fourni. Etes-vous sûr qu'aucun autre fichier d'en-tête n'a le même garde "_WFQUEUE_HPP"? – icecrime

+0

ABSOLUMENT aucun autre fichier n'a cela – Andry

+0

Que contient 'workflow.hpp'? –

Répondre

3

Juste une supposition sauvage: Votre erreur indique que

class WFQueueManagerProxy : public WFQueue { // This is the problem (line 42) 
//... 
}; 

il doit y avoir un nom de classe avant {. Par conséquent, je suppose que le compilateur ne sait pas que WFQueue est une classe. Êtes-vous sûr que sa définition est incluse? Je veux dire, peut-être dans wfqueue.hpp la classe est appelée WfQueue ou différente d'une autre manière?

+0

Merci M. Tsurunyan ... Le problème était tout à fait différent ... heureusement que je pouvais le remarquer ... très bizarre ... lire mon asnwer et avoir un peu de rire :) – Andry

1

Le problème peut être mal nommé, y compris les gardes. Essayez de vérifier s'ils sont vraiment uniques par fichier. Il semble que vous l'avez fait pour désactiver la définition de WFQueue lors de la compilation WFQueueManagerProxy.

+0

Comme vous pouvez le voir sur ma réponse .. le problème en était un autre, mais lié à celui que vous me dites. Merci pour votre effort. – Andry

4

Vous devez exécuter le préprocesseur sur votre code mais ne pas le compiler et examiner le résultat. Pour ce faire, copiez la commande qui exécute la compilation défaillante et, avec la plupart des compilateurs, supprimez l'option -o outfile et ajoutez quelque chose comme -E (consultez la documentation de votre compilateur pour l'indicateur qui ne traite que le prétraitement). Le compilateur émettra (sur stdout) l'ensemble de l'unité de traduction avec tous les #includes et tels résolus, ainsi vous pouvez voir clairement ce qui manque (recherchez simplement la ligne de code qui correspond à la ligne d'erreur, puis regardez vers voyez quelles déclarations vous trouvez).Si le problème n'est toujours pas clair, écrivez la sortie prétraite dans un fichier et essayez de la compiler. Vous pouvez ensuite modifier la source prétraite et voir ce qui est nécessaire pour la réparer.

+0

Approche intéressante. +1 – Default

+0

J'accepte ... +1 :) – Andry

1

C'est quelque chose qu'il n'est jamais arrivé ... mon dieu désolé ... Il semble que mon disque de sauvegarde de la machine virtuelle est entré en collision avec le disque d'origine. Je cours mon projet sur une machine virtuelle, rendant la sauvegarde, il y a 2 heures, probablement quelque chose de foiré ... Je l'ai ajusté et maintenant la machine virtuelle peut localiser le bon dossier et les bons fichiers à compiler. C'était génial ahaha et évident, les fichiers ols g ++ ont essayé de compiler une version précédente remplie d'erreurs ... C'était un de ces bugs ... un en-tête de garde répété. Icecrime avait raison ... malgré que je cherchais des répétitions dans mes fichiers, dans la version précédente, où je n'ai pas résolu ce problème, il y avait quelques fichiers que j'ai collés et j'ai oublié de changer l'en-tête de garde. Merci à tous pour votre patience et vos efforts. Je suis désolé de ne pas avoir remarqué cette étrange collision de disque virtuel dans ma machine. Merci encore.

+1

Oui, vous avez dit que ma réponse était incorrecte et l'a toujours acceptée ... Je ne comprends pas;) –

+0

Eh bien, en fait, votre réponse est correcte Armen. J'ai commencé à partir de votre déclaration afin de comprendre ce qui n'allait pas et ce que vous m'avez suggéré est la bonne procédure. Le fait qu'il y ait eu des erreurs à cause des collisions est lié à ma machine. Je pense que pour cette communauté, si quelqu'un rencontre, cette erreur devrait continuer comme réponse. Mon cas était très spécial, mais votre réponse est assez générique et, d'une manière ou d'une autre, spécifique; C'est pourquoi je l'ai choisi comme le bon. – Andry

0

Assurez-vous que vous avez saisi

using namespace omnetpp; 

après comprend. Cela a résolu mon problème.

Questions connexes