头文件中的struct无法识别

时间:2013-12-20 23:17:36

标签: c++ struct header-files

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'

所有错误的原因是什么?为什么变量不会被识别为结构的字段?

4 个答案:

答案 0 :(得分:5)

问题是当头解析器没有类型字符串时。

最好的方法是包括名称空间,例如

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

};

这不会显示在cpp文件中,因为您有using namespace std;

您可以将使用行放在#include“practice.h”之前,但这被认为是错误的样式,因为标题现在不是自包含的,您可能会遇到名称空间冲突。

答案 1 :(得分:1)

你需要在practice.h中包含。

像这样:

#include <string>

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

答案 2 :(得分:1)

包含不是必需的,但您必须导入名称空间std或完全限定其使用。因此,请重复using语句或将name声明为std::string类型。

答案 3 :(得分:0)

你应该使用“#ifndef”,“#define”。因为头文件可能会调用初始化一些时间。因此你会犯错。看看这个:C++’ta Seperated Compilation II – Header File Kullanmak