2013-12-20 6 views
0

practice.h구조체

struct CandyBar 
{ 
    string name; 
    double weight; 
    int calories; 

}; 

#include <iostream> 
#include <string> 
#include "practice.h" 

using namespace std; 

int main() 
{ 
    CandyBar snacks{ "Mocha Munch", 2.3, 350 }; 

    cout << snacks.name << "\t" << snacks.weight << "\t" << snacks.calories << endl; 
    return 0; 
} 

, 나는 오류를 얻을 practice.cpp :

practice.h(5): error C2146: syntax error : missing ';' before identifier 'name' 

practice.h(5): error C4430: missing type specifier - int assumed. Note: C++ does not support default-int 

error C2440: 'initializing' : cannot convert from 'const char [12]' to 'double' 

There is no context in which this conversion is possible 

practice.cpp(20): warning C4244: 'initializing' : conversion from 'double' to 'int', possible loss of data 

practice.cpp(20): error C2078: too many initializers 

practice.cpp(22): error C2039: 'name' : is not a member of 'CandyBar' 

practice.h(4) : see declaration of 'CandyBar' 

원인이 무엇인가 모든 오류 중? 변수가 구조체의 필드로 인식되지 않는 이유는 무엇입니까?

+3

헤더에'#include '과'std ::'가'string name;'앞에 누락되었습니다. 편집 : 소스 파일에 헤더를 포함하기 전에''을 포함하고 있다는 것을 알지 못 했으므로 include 문 없이도 작동해야하지만 의존성이 있으므로 헤더에 include 문을 추가하는 것이 좋습니다. std :: string에. 그리고'namespace std;를 사용하는 것은 매우 나쁜 습관입니다! – Praetorian

+1

적어도 "using namespace std;"는 헤더가 아닌 * .cpp 파일에 있습니다. – aschepler

답변

4

문제는 그 헤더 파서가 어떤 유형의 문자열이없는 경우.

가장 좋은 방법은 네임 스페이스를 포함하는 것입니다.

struct CandyBar 
{ 
    std::string name; 
    double weight; 
    int calories; 

}; 

이것은 당신이 using namespace std;

당신은 사용법 #include "practice.h"전에 사용하여 줄을 추가 할 수 있습니다로 CPP 파일에 표시되지 않지만 헤더 지금처럼 그는 나쁜 스타일로 간주됩니다 자체 포함되어 있지 않으며 네임 스페이스 충돌이있을 수 있습니다.

+0

cpp 파일에'#include '과 std 네임 스페이스가 있다면, 왜 제가 std :: string을해야합니까? – Bbvarghe

+1

using 줄은 현재 #include "practice.h"다음에 있습니다. 따라서 컴파일러에서 practice.h 헤더를 읽으면 네임 스페이스 std – Mark

1

연습 h에 포함해야합니다.

과 같이

:

#include <string> 

struct CandyBar 
{ 
    std::string name; // And also std:: before string, as Praetorian pointed out 
    double weight; 
    int calories; 
}; 
+0

이 작은 샘플은 중요하지 않습니다. 헤더가 파싱 된 지점에'string'이 이미 포함되어 있습니다. –

+1

@Niels : 네 말이 맞아. 고마워. 고마워. 즉, 컴파일 오류가 발생하는 클래스의 향후 사용을 피하기 위해 정의에 의존하는 파일에 헤더를 포함시키는 것이 일반적이므로 더 나은 방법이므로 그대로 사용합니다. – Rob

+0

동의 함, 나는 방금 네임 스페이스 수정을 포함하도록 수정하기 전까지 문제의 해결책이 아니라고 말했습니다 : –

1

포함은 필요하지 않지만 네임 스페이스 std을 가져 오거나 그 사용법을 완전히 인증해야합니다. 따라서 using 문을 반복하거나 namestd::string으로 선언하십시오.

0

"#ifndef", "#define"을 사용해야합니다. 어쩌면 헤더 파일이 몇 번 초기화하기 위해 호출 할 수 있기 때문입니다. 따라서 오류가 발생합니다. 다음을보십시오 : C++’ta Seperated Compilation II – Header File Kullanmak

+1

을 사용하고 있는지 알지 못합니다. 좋은 조언이지만 문제를 해결하지 못합니다. OP가 가지고 있었다. –