2010-12-15 62 views
0

Je crois que je me suis creusé dans un trou. Tout en brisant mon seul fichier, couple mille lignes ligne de code dans plusieurs fichiers, je semble avoir grossièrement foiré la structure du programme.
Je suis novice dans le domaine du C++ et de ses fichiers d'en-tête et de gestion de l'espace de noms, donc j'ai appris au fur et à mesure. Je suppose que je ne comprends pas complètement comment #include, using et namespaces sont en corrélation et quels transferts vers d'autres fichiers, etcDépendances, espace de nom et en-têtes

Lire la documentation de MSDN Je peux voir les bribes de mon problème mais la solution m'échappe . A partir de maintenant j'ai quatre fichiers .cpp et en-têtes:


1) Un fichier principal

2) GameData Cpp et son en-tête qui est contenu dans l'espace de noms pData

3) A GameSettings cpp et son en-tête qui est contenue dans l'espace de noms pSettings

4) GeneralScreens cpp et son en-tête qui est contenue dans l'espace de noms pScreens


Lors de la compilation du débogueur SPEWS plus de 100 d'erreur comme:

>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(454): error C2447: '{' : missing function header (old-style formal list?) 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(463): error C2039: 'pair' : is not a member of 'std' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(463): error C2955: 'pScreens::std::pair' : use of class template requires template argument list 
1>   c:\program files (x86)\microsoft visual studio 10.0\vc\include\utility(173) : see declaration of 'pScreens::std::pair' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(33): error C2873: 'wcsrtombs' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(41): error C2039: 'wctob' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(41): error C2873: 'wctob' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2039: 'wmemchr' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2873: 'wmemchr' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2039: 'wmemcmp' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2873: 'wmemcmp' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2039: 'wmemcpy' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(42): error C2873: 'wmemcpy' : symbol cannot be used in a using-declaration 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\cwchar(43): error C2039: 'wmemmove' : is not a member of '`global namespace'' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\new(93): error C2039: 'nothrow_t' : is not a member of 'std' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\new(93): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\new(93): error C2143: syntax error : missing ',' before '&' 
1>c:\program files (x86)\microsoft visual studio 10.0\vc\include\new(99): error C2039: 'new_handler' : is not a member of 'std' 

ces erreurs sont-indication de quelque chose?

Je suppose que quelque chose ne va pas avec la façon dont je fais référence à la bibliothèque std bien que je n'ai aucune idée de la façon de localiser l'erreur, car toutes les erreurs sont dans les fichiers de bibliothèque.

+1

Quelle est la quantité minimale de code à l'origine de ce problème? –

+0

Un échantillon de code minimal aiderait énormément. En plus de cela, vous pouvez rechercher MSDN pour les codes d'erreur: la page de chaque code d'erreur donne des exemples de ce qui peut le déclencher, ainsi vous pouvez comparer votre code avec ceux-ci. – suszterpatt

Répondre

3

Il est très probable qu'un point-virgule soit manquant à la fin si une définition de classe ou de structure figure dans un fichier d'en-tête. Le compilateur traite ensuite chaque identificateur qu'il voit comme une instance de cette classe au lieu de ce que vous attendez. Ensuite, le compilateur se plaint parce qu'il n'a aucune idée de ce qu'il faut faire avec les stray {} s qu'il voit.

Vérifiez l'en-tête #include d juste avant <utility> dans votre fichier d'implémentation; cet en-tête est le plus probable où la faute réside. Side note: Pour éviter ce problème, toujours #include en-têtes standard avant vos propres en-têtes dans un fichier .CPP. Par exemple, au lieu de

// MyGameThing.cpp 
#include "MyGameThing.hpp" 
#include <utility> 
#include <string> 

// code 

do

// MyGameThing.cpp 
#include <utility> 
#include <string> 
#include "MyGameThing.hpp" 

// code 

De cette façon, vous ne serez pas les erreurs de compilation comme celui-ci enterré dans les en-têtes standard.

+0

une chose cependant est que je n'ai jamais inclus utilitaire, devrais-je juste aller chercher la bibliothèque qui l'a comme une dépendance? – Fuller

+0

Merci pour le conseil sur l'ordre des fichiers d'en-tête aussi, je me demandais à ce sujet – Fuller

+0

@Fuller: '' est inclus dans plusieurs endroits (à savoir parce qu'il contient 'std :: pair' qui est utilisé pour des choses comme' std :: map'). Modifiez vos ordres d'inclusion et vérifiez vos en-têtes pour les points-virgules manquants. –

0

Si vous utilisez Visual C++, ouvrez le premier fichier cpp et appuyez sur CTRL + F7, cela ne compilera que le fichier cpp, vérifiez la première erreur et essayez de corriger cela. Une fois corrigé, passez au fichier cpp suivant si l'erreur persiste.

+0

L'erreur ne se produit pas dans un fichier cpp, elle se produit dans l'en-tête 'utility'. –

+0

Ceci est une astuce plutôt cool, je profite pleinement de toutes ces réponses. – Fuller

+0

Je sais que l'erreur ne se produit pas sur un fichier cpp, mais vous ne pouvez pas compiler un fichier d'en-tête, seulement cpp, c'est pourquoi je vous demande de compiler chaque fichier cpp à la fois. – bcsanches

3

La première erreur du compilateur va être votre meilleur indice:

c: \ program files (x86) \ Microsoft Visual Studio 10.0 \ vc \ include \ utility (454): erreur C2447: « { ': En-tête de fonction manquant (liste formelle à l'ancienne?

Je suppose que ce qui se passe ici est que vous pouvez avoir une déclaration de classe ou de struct sans point-virgule. Donc, vous avez quelque chose comme ceci:

struct Foo 
{ 
} // <--- no semicolon here will generate funky errors 

Mais dans l'ensemble, payer près & une attention particulière à la première erreur du compilateur. Comme le mention @Billy dans les commentaires ci-dessous, les règles struct et class sont identiques. Dans les deux cas, vous avez besoin du point-virgule. De plus, old-school code C souvent typedef struct comme ceci:

typedef struct tag_Foo 
{ 
} Foo; // <-- still need the semicolon 

Ici, vous encore besoin du point-virgule.

+0

+1 pour l'exemple de code de ce dont je parlais.Notez que les règles 'class' ne sont pas différentes de' struct' - vous avez besoin du point-virgule. –

+0

@Billy: Edité pour être plus précis à ce sujet, merci –

0

La tentative de Billy est décente, mais la réponse habituelle à un ';' est pour le compilateur de le dire. Par contre, un '}' manquant peut sérieusement perturber les en-têtes standards inclus par la suite car tout leur contenu est dans la portée de l'espace de noms ou de la classe qui aurait dû être fermé. Aussi, ';' missing est plus immédiatement détectable alors qu'un '}' manquant n'est pas nécessairement une erreur, donc le compilateur pisse juste un ajustement à la première chose qui n'a pas de sens dans cette portée.

En outre, à la ligne 454 dans l'utilitaire pour le compilateur 2010 est l'accolade d'ouverture pour une spécialisation de tuple_size pour std :: pair. Poster préprocesseur cette définition ressemblerait à ceci:

template <...> 
struct tuple_size< ::std::pair<_Ty1, _Ty2> > 

Si vous avez oublié un « } » la fermeture d'un espace de noms alors ce n'est pas où pair<> existe plus. Au lieu de cela, car il est déclaré comme ceci:

namespace std { template <...> struct pair ... } 

Quelle que soit la portée n'a pas été fermé est maintenant où std est en cours et déclaré struct tuple_size< ::std::pair<...> > ne fait pas de sens à l'analyseur. Comme ce n'est pas un nom valide, il a tendance à prétendre que ce n'est même pas là, puis «{» à l'échelle mondiale sans rien de sens avant qu'il ne soit assez déroutant.

BTW, un avantage souvent non dit de faire des exemples minimes qui causent le problème est que vous finissez par TROUVER le problème en essayant d'y arriver.

+0

Désolé j'ai eu un peu de malentendu ici, les erreurs que j'ai posté étaient simplement un échantillon d'environ 200 quelque chose, l'erreur utilitaire n'est pas le premier dans la pile. Je suis actuellement à la recherche d'une incompatibilité mais comme cela semble être la réponse commune ici. – Fuller