尽管包含.h,但未在中声明类
class not declared in even though .h was included
我对c++还比较陌生,遇到了一个奇怪的问题,
我得到了"ToDoItem没有在这个范围内声明",但我已经包含了ToDoItem.h文件
错误在这个类定义中:
#ifndef ITEMMONITOR_H
#define ITEMMONITOR_H
#include <QObject>
#include <QPointer>
#include <QTimer>
#include "todoitem.h"
class ItemMonitor : public QObject{
Q_OBJECT
signals:
void finished();
public:
explicit ItemMonitor(std::vector< QPointer<ToDoItem> >& items_);
private:
std::vector< QPointer<ToDoItem> >& items;
bool shouldRun;
public slots:
void beginMonitoring();
void finishUp();
};
#endif // ITEMMONITOR_H
todoitem.h是:
#ifndef TODOITEM_H
#define TODOITEM_H
#include <string>
#include <QString>
#include <QPushButton>
#include <QFrame>
#include <QDateTime>
#include "todolist.h"
namespace Ui {
class ToDoItem;
}
class ToDoItem : public QFrame{
Q_OBJECT
public:
//constructor and destructor
explicit ToDoItem(QFrame *parent = 0);
~ToDoItem();
//functions
void setValues(QString mainText_, // sets all import
QString additionalText_,
QDateTime dateTime_,
bool hasDeadline_);
void paintEvent(QPaintEvent *pe); //added to support stylesheets
void setDeadline(QDateTime deadline_);
QDateTime getDeadline();
bool getHasDeadline();
void setId(int id_);
int getId();
void setSecsTillDeadline();
int getSecsTillDeadline();
bool getSorted();
void setSorted(bool sorted_);
QString getMainText();
private:
QString formatTime(int duration_);
Ui::ToDoItem *ui;
int id;
QDateTime deadline;
bool hasDeadline;
int secsTillDeadline;
bool sorted; // set to true only during the sorting process
};
#endif // TODOITEM_H
常见的循环包含问题发生在:
a.h
#ifndef A_H
#define A_H
#include "b.h"
// do something requiring content from b.h
#endif
b.h
#ifndef B_H
#define B_H
#include "a.h"
// whatever
#endif
如果某个cpp包含"a.h",你可能会逃脱惩罚(如果b.h并不真的需要a.h)。但如果该cpp包含b.h,那么b.h包含a.hBEFORE声明a.h所需的东西。然后a.h尝试包含b.h但include保护块阻止了它,因此编译器在不包含b.h声明的情况下处理a.h,并失败。
这个常见的问题通常被另一层掩盖,就像在你的例子中一样:todoitem.h包含了"todolist.h",尽管它并不真正需要它,但"todolest.h"包含了"intermmonitor.h",它需要"todoitem.h",但由于include保护而未能包含它。
请确保检查每个标头是否具有唯一的#define
值。
当复制头文件但忘记将#define HEADER_H
更改为唯一标识符时,可能会发生这种情况,因此即使您#include
也会阻止包含新的头文件。
相关文章:
- 包含的类类型显然没有声明,为什么?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- C++(和 ROS) - 包含与前向声明引用,设置默认值和类型定义
- 我包含了<winuser.h>,但编译器在MonitorFromWindow上抛出"未声明"
- 即使不包含其标头,如何成功向前声明的类编译?
- 包含文件中的 Typdef "未在此范围内声明"
- 程序只适用于包含(无副作用)cout声明
- 循环包含依赖项/转发声明
- 我收到未声明的标识符错误,但我已包含头文件?
- 如何声明包含整数数组的对象
- 我需要在不使用前向声明的情况下相互包含两个头文件,导致"incomplete type"错误
- 我需要声明一个包含整数向量的 4x4 矩阵
- 错误: 包含 <Kinect.h> 时未声明"_Out_"
- 为什么我们可以创建一个模板类结构,其中包含许多与声明结构时指定的参数不同的参数
- 如何声明包含结构的类的成员函数
- 在声明时,向前斜线或后斜线包含在C 上
- 如何在不包含 Windows.h 的情况下获取 IsDebuggerPresent 的声明
- 使用声明包含未展开的参数包
- 如何声明包含对外部类的引用的成员变量
- 在声明包含类型的对象时遇到问题