2010-02-12 27 views
7

önce bu hatalardan kurtulmak yok ... ben kontrol ettiğim her yerde noktalı virgül var ... kod basit: hata article.h içinde "dize adı" tanımı için beni alır ...hatası C2146: sözdizimi hatası: eksik ';' identifier

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

Nasıl derliyorsunuz? –

+0

OSX altında derleniyor - bu yüzden daha fazla bilgiye ihtiyacımız var – Mark

+0

Bana göre çalışması gerektiği gibi görünüyor ve GCC'de çalışıyor. 'namespace std;' kullanarak bir dosya eklemeden önce savaşların neden olduğu ve kendinizden utanmalısınız ;-) Ama bundan başka, iyi. Yanlış bir kaynak dosyasına bakıyor olmanız ve 'string 'geçerli bir tür yapmadan article.h içeren başka bir kaynak dosya var mı? –

cevap

12

gibi, Sen başlığında std :: ad öneki kullanmalıdır

+2

Doğru, sen gerekir, ama bu durumda kod derleme olup olmadığını herhangi bir değişiklik yapmak neden görmüyorum. Dünyanın en büyük (IMHO) dili olan –

+4

, en belirsiz hatalara sahiptir. Güzel hatalar için java'yı özledim, yazarken bile kodunuzda yanlış olanı biliyor olabilirsiniz. Oh iyi... – vvMINOvv

3

O artivle.h dosyasında tanımlı değil string tip görünüyor. iostream dahildir ve using namespace std eklemeyi deneyin (veya yerine ad kullanmanın std::string yazma)

std::string name; 
+2

"iostream" öğesini article.h dosyasına dahil etmeyin: include 'string', tüm bu üstbilginin ihtiyacı. –

+0

Bu, iyi bir uygulamadır çünkü her başlık kendi başına dahil edilirse birbiriyle karşılaştırılabilir olmalıdır. Bununla birlikte, bu durumda makale.h dahil olmak üzere dize tanımlandığı gibi bir önemi yoktur. – Mark

3

Sen eklemek gerekir:

#include <string> 
senin "article.h" başlığı dosyasına

ve beyan adı böyle:

std::string name; 
+2

'# include' ifadesinden önce 'names' std' kullanıldığında bu gerekli değildir ve hataları gerçekten açıklamamaktadır. Bu, bir başlık dahil önce bir 'isim isim std' kullanarak koymak için güvenerek oldukça kötü bir uygulama olduğunu – Glen