2010-02-12 16 views
7

no puedo deshacerme de estos errores ... tengo punto y coma en todas partes que revisé ... el código es simple: el error me lleva a la definición "nombre de cadena" en article.h ...error C2146: error de sintaxis: falta ';' antes del identificador

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

¿Cómo la compila? –

+0

Compila bajo OSX, entonces necesitamos más información – Mark

+0

Parece que debería funcionar para mí, y funciona en GCC. 'usar namespace std;' antes de incluir un archivo es el motivo por el que suceden las guerras, y deberías avergonzarte ;-) Pero aparte de eso, está bien. ¿Podría ser que esté buscando el archivo fuente incorrecto y hay algún otro archivo fuente que incluya article.h sin hacer que 'string' sea un tipo válido? –

Respuesta

12

Usted debe agregar:

#include <string> 

a su archivo de encabezado "article.h" y declare nombre como este:

std::string name; 
+2

Es cierto, deberías, pero no veo por qué habría alguna diferencia en si el código se compila en este caso. –

+4

el idioma más grande del mundo (mi humilde opinión), tiene los errores más oscuros. Extraño a Java por sus hermosos errores, podrías saber EXACTAMENTE qué está mal con tu código, incluso mientras escribes. Oh bien... – vvMINOvv

3

parece el tipo string no está definido en el archivo artivle.h. Trate de incluir iostream y añadir using namespace std (o escribir std::string en lugar de utilizar espacio de nombres)

+2

No incluya 'iostream' en article.h: include' string', que es todo lo que necesita el encabezado. –

+0

Esta es una buena práctica ya que cada encabezado debe ser compilable si se incluye solo. Sin embargo, en su caso no importa ya que la cadena se define antes de que se incluya article.h – Mark

3

Se debe utilizar el prefijo de espacio de nombres std :: en la cabecera, como

std::string name; 
+2

Poner 'using namespace std' antes de' # include' significa que esto no es necesario y realmente no explica los errores. Dicho esto, depender de alguien para poner 'using namespace std' antes de incluir un encabezado es una mala práctica – Glen