структура в заголовочном файле не распознана

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 <string> и std:: перед string name; в шапке. Редактировать: не заметил, что вы включаете <string> перед тем, как включить заголовок в ваш исходный файл, поэтому он должен работать и без оператора include, но все же стоит добавить оператор include в заголовок, так как он зависит на std::string . И using namespace std; это очень плохая практика!
  • 1
    По крайней мере, это using namespace std; был в файле * .cpp, а не в заголовке.
Теги:
struct
header-files

4 ответа

4
Лучший ответ

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

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

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

};

Это не отображается в файле cpp, поскольку вы using namespace std;

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

  • 0
    если у меня есть #include <string> и пространство имен std в файле cpp, почему я должен делать std :: string?
  • 1
    Строка использования в настоящее время идет после #include "practice.h", поэтому, когда компилятор читает заголовок Practice.h, он не знает, что вы используете пространство имен std.
1

Включение не требуется, но вы должны либо импортировать пространство имен std либо полностью квалифицировать его использование. Поэтому либо повторите оператор using либо объявите name как тип std::string.

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: Ты прав. Я пропустил это, спасибо. Тем не менее, я сохраняю все как есть, так как обычно лучше включать заголовочные файлы в файлы, где вы полагаетесь на их определения, чтобы избежать будущего использования ваших классов, приводящих к ошибкам компиляции.
Показать ещё 1 комментарий
0

Вы должны использовать "#ifndef", "#define". Потому что, возможно, заголовочные файлы могут вызывать для инициализации несколько раз. Поэтому вы принимаете ошибки. Посмотрите: С++ ta Отдельная компиляция II - Файл заголовка Kullanmak

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню