2013-12-20 2 views
0

practice.hструктура в файле заголовка не распознается

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

}; 

practice.cpp

#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.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'. И 'using namespace std;' очень плохая практика! – Praetorian

+1

По крайней мере, это 'using namespace std;' было в файле * .cpp, а не в заголовке. – aschepler

ответ

4

Проблема в том, что, когда заголовки парсера нет типа строки.

Лучшим способом является включение пространства имен, например.

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

}; 

Это не появляется в файле CPP, как у вас есть using namespace std;

Вы можете поместить используя строку перед #include «practice.h», но это считается плохим стилем, как заголовок теперь не самодостаточно, и у вас могут быть конфликты пространства имен.

+0

, если у меня есть '#include ' и std-пространство имен в файле cpp, почему я нужно делать std :: string? – Bbvarghe

+1

Используемая строка в настоящее время после #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, либо объявите name как тип std::string.

0

Вы должны использовать «#ifndef», «#define». Потому что, возможно, заголовочные файлы могут вызывать для инициализации несколько раз. Поэтому вы принимаете ошибки. Посмотрите на это: C++’ta Seperated Compilation II – Header File Kullanmak

+1

Хотя это хороший совет, он не решает проблему ОП имел. –

Смежные вопросы