我是C ++的新手并尝试制作一张所有源文件都能够访问的地图。这是有问题的代码的简化版本。每个头文件都有一个标题保护,我只是没有在这里输入它们。
// main.cpp
#include "client.hpp"
int main(void){
init();
search();
}
// util.cpp
#include "util.hpp"
std::map<int, STUDENT_TYPE> dataBase;
init(){
dataBase[0] = STUDENT_TYPE(14, 4.0);
// more students....
}
// util.hpp
#include <map>
struct STUDENT_TYPE{
int age;
int grade;
STUDENT_TYPE(int age, int grade) : age(age), grade(grade){}
};
extern std::map<int, STUDENT_TYPE> dataBase;
// client.cpp
#include "client.hpp"
void search(){
std::cout << dataBase[0].grade << std::endl;
}
// client.hpp
#include "util.hpp"
void search();
问题是编译器无法在搜索功能上构建。它给出了一大堆错误。最后一个错误或所有错误的原因是STUDENT_TYPE的构造函数在给定0时需要2个字段。我怀疑客户端无法访问dataBase中的STUDENT_TYPE结构。我不知道如何修复它或确切地说它是如何发生的。我只想要一个学生大表,程序中的所有文件都可以访问。
答案 0 :(得分:3)
编译器正在告诉你究竟出了什么问题。您的学生类型没有默认构造函数并且正在使用它。
为什么要使用它?
因为map::operator []
将创建一个默认的构造实例,如果该键的条目尚不存在则返回该实例。即使这种情况从未发生过,编译器仍然必须编译该分支,它不能在这里。
两种解决方法:
map::operator[]
。而是使用map::find
。答案 1 :(得分:1)
第一种解决方案;没有全局数据结构。通常根本不需要这样的东西。
其次,了解标题保护程序的作用 - 它们会阻止标题文件的正文包含在相同的转换单元中。如果头文件包含在多个.cpp文件中,则它们无效。
第三,当您在此处发布有关问题的问题时,请发布您收到的错误消息的全文。