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'
所有错误的原因是什么?为什么变量不会被识别为结构的字段?
答案 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