2010-02-12 3 views
7

je ne peux pas me débarrasser de ces erreurs ... j'ai des points-virgules partout j'ai vérifié ... le code est simple: l'erreur me conduit à la définition "nom de la chaîne" dans article.h ...erreur C2146: erreur de syntaxe: manquant ';' avant l'identifiant

main.cpp

#include <iostream> 
#include <fstream> 
#include <vector> 
#include <string> 

using namespace std; 

#include "article.h" 

int main() 
{ 
string si; 
char article[128]; 
vector<Article> articles; 
ifstream file; 


file.open("input.txt",ifstream::in); 

while(!file.eof()) 
{ 
    file.getline(article,128); 
    articles.push_back(Article(article)); 

} 

file.close(); 

while(1); 
return(1); 
} 

article.h:

#ifndef Article_H 
#define Article_H 

class Article 
{ 
public: 
int year; 
string name; 

Article(char *i_name); 
}; 

#endif 
+1

Comment le compilez-vous? –

+0

Il compile sous OSX - donc nous avons besoin de plus d'informations – Mark

+0

On dirait que cela devrait fonctionner pour moi, et cela fonctionne sur GCC. 'using namespace std;' avant d'inclure un fichier c'est pourquoi les guerres se produisent, et vous devriez avoir honte de vous ;-) Mais à part ça, bien. Serait-ce que vous regardez le mauvais fichier source, et il y a un autre fichier source qui comprend article.h sans faire de 'string' un type valide? –

Répondre

12

Vous devez ajouter:

#include <string> 

à votre fichier d'en-tête "article.h" et déclarez nom comme ceci:

std::string name; 
+2

C'est vrai, vous devriez, mais je ne vois pas pourquoi cela ferait une différence si le code compile dans ce cas. –

+4

le plus grand langage (IMHO) du monde, a les erreurs les plus obscures. Java me manque pour ses belles erreurs, vous pouvez savoir exactement ce qui ne va pas avec votre code, même si vous écrivez. Tant pis... – vvMINOvv

3

Il semble le type string n'est pas défini dans le fichier artivle.h. Essayez d'inclure iostream et ajouter using namespace std (ou écrire std::string au lieu d'utiliser l'espace de noms)

+2

N'incluez pas 'iostream' dans article.h: include' string', qui est tout ce dont l'en-tête a besoin. –

+0

Ceci est une bonne pratique car chaque en-tête doit être compilable s'il est inclus seul. Cependant, dans son cas, cela n'a pas d'importance puisque string est défini avant que article.h ne soit inclus – Mark

3

Vous devez utiliser le std :: préfixe d'espace de noms dans l'en-tête, comme

std::string name; 
+2

Le fait de mettre 'using namespace std' avant le' # include' signifie que cela n'est pas nécessaire et n'explique pas vraiment les erreurs. Cela dit, compter sur quelqu'un pour mettre un 'using namespace std' avant d'inclure un en-tête est une mauvaise pratique – Glen