错误:类名没有在C++中命名类型
Error: class name does not name a type in C++
我知道这个问题已经被问了很多次了,但我尝试了一些建议,比如检查拼写,确保我包含了头文件、大写字母等,但我仍然会遇到同样的错误,不知道是什么触发了它。
当我尝试使用g++-c Customer.h编译Student.h时,我得到错误"Student"没有在"Student Student;"行上命名类型我不知道为什么。有人能找出原因吗?该变量应该表示该登录id/帐户的学生,该id/帐户应该是指向student对象的指针。
同样,当我尝试编译Login.h时,我得到错误"Login"没有在Customer.h中为bool addAcct(Login*(声明,以及错误"Login'没有Login*logins[MAX_logins]的类型。
任何帮助都将不胜感激!
学生:
#ifndef STUDENT_H
#define STUDENT_H
#define MAX_LOGINS 4
#include <string>
#include "Login.h"
using namespace std;
class Student{
public:
Student(int = 0, string = "");
int getId();
bool addAcct(Login*);
void print();
private:
int id;
string name;
Login* logins[MAX_LOGINS];
int numberOfLogins;
};
#endif
登录.h
#ifndef LOGIN_H
#define LOGIN_H
#include <string>
#include "Student.h"
using namespace std;
class Login{
public:
Login(int = 0, float = 0);
int getNumber();
void setStudent();
void print();
private:
int number;
Student student;
};
#endif
这里的问题是循环依赖关系(如注释中所指出的(,而问题是处理器本质上将#include
语句作为顺序文本插入来处理。
例如,当预处理器遇到#include "student.h"
时,它会像一样一步一步地进行
#ifndef STUDENT_H // <--- header guard not defined at this point, ok to proceed
#define STUDENT_H // <--- define header guard first thing in order to prevent recursive includes
#define MAX_LOGINS 4
#include <string>
#include "Login.h" ---> #ifndef LOGIN_H
#define LOGIN_H
#include <string>
#include "Student.h" ---> #ifndef STUDENT_H
// entire body of student.h is skipped over
// because STUDENT_H header guard is defined
using namespace std; <--- // so processing continues here
class Login{
// ...
Student student; // <--- error because class Student is not defined
};
解决方案是转发声明不需要完整定义的类型,而不需要#include
'相应的标头。
在这种情况下,class Login
有一个成员Student student;
,它需要完全定义class Student
,所以login.h
实际上必须是#include "student.h"
。
然而,class Student
只携带指向Login
的指针的Login* logins[MAX_LOGINS];
数组,并且指针不需要类的完整定义,而只需要类型的前向声明。因此,可以将Student.h
修改为前向声明class Login
,这消除了循环头依赖关系,并允许代码进行编译。
// #include "Login.h" // <--- full header not required
class Login; // <--- forward declaration is sufficient
- ArduinoJson 6.15.2:JsonObject没有命名类型
- 防止主数据类型C++的隐式转换
- 大量序列中核苷酸类型的快速计数
- 如何从C++中的依赖类型中获得它所依赖的类型
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- 是否可以初始化不可复制类型的成员变量(或基类)
- 如何获取std::result_of函数的返回类型
- 从父命名空间重载类型
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- 我想将一个对T类型的非常量左值引用绑定到一个T类型的临时值
- Openssl 1.1.1d无效使用不完整的类型"struct dsa_st"
- 访问者访问变体并返回不同类型时出错
- 在VS2010-VS2015下编译时,如何使用decltype作为较大类型表达式的LHS
- 处理小于cpu数据总线的数据类型.(c++转换为机器代码)
- C++ 雷神库 - 使用资源加载器类时出现问题(不命名类型)
- 模板元程序查找相似的连续类型名称
- 是否可以从int转换为enum类类型
- 构造函数正在调用一个使用当前类类型的函数
- 我应该使用什么来代替void作为变体中的替代类型之一
- 类中的字符串不命名类型