是啥导致类型不完整? (QGraphicsItem:源或目标的类型不完整)

Posted

技术标签:

【中文标题】是啥导致类型不完整? (QGraphicsItem:源或目标的类型不完整)【英文标题】:What leads to incomplete types? (QGraphicsItem: Source or target has incomplete type)是什么导致类型不完整? (QGraphicsItem:源或目标的类型不完整) 【发布时间】:2012-04-23 22:08:00 【问题描述】:

我有一个自定义的 QGraphicsItem,它(除其他外)使用 Qt 文档中描述的标准过程在单击时将光标更改为张开的手。这在过去两周左右工作得很好。 昨天,我在课堂上改变了一些东西。最重要的是,我现在直接从 QGraphicsPixmapItem 而不是 QGraphicsItem 子类化。

在某些时候,我开始收到以下错误(部分是我自己的翻译):

C664:将参数 1 从 'Qt::CursorShape' 转换为 'const QCursor &' 不可能。源或目标的类型不完整。

我现在试图弄清楚为什么我的商品类型不完整。不幸的是,当这个问题开始发生时,我无法追溯。改变的基类是我唯一的猜测,但我真的想不出一种方法,这怎么可能是原因。谷歌搜索错误后,我找到了一些示例,其中类成员的定义有些不明确,但我在声明中找不到错误。所以,这里是标题,以防我错过了什么:

#include <QGraphicsPixmapItem>
class Collection;
class ItemSource;

class PhotoItem : public QGraphicsPixmapItem

public:
    PhotoItem( QString sourceFilePath, Collection *collection =0, QColor color =Qt::white, qreal size = 80.0);

    enum Orientation     portrait, landscape ;

    QPixmap content();
    bool hasContent();
    QColor color();

    void paint(QPainter *painter, const QStyleOptionGraphicsItem *option, QWidget *widget);
    QRectF boundingRect() const;

    void mousePressEvent(QGraphicsSceneMouseEvent *event);
    void mouseMoveEvent(QGraphicsSceneMouseEvent *event);
    void mouseReleaseEvent(QGraphicsSceneMouseEvent *event);
    void mouseDoubleClickEvent(QGraphicsSceneMouseEvent *event);

private:
    qreal _size;
    Orientation _orientation;
    QPixmap _content;
    QColor _color;
    Collection *_collection;
    ItemSource *_source;
;

如果这个文件是正确的,那么是否有任何导致我可以检查的未定义类型的常见问题?也许我什至在错误的地方搜索?

感谢您的宝贵时间, 路易丝

【问题讨论】:

【参考方案1】:

什么导致类型不完整?

如果不包含定义类型的头文件,而是添加以下行:

class myclass;

It Forward 声明了 myclass 类,这意味着对于编译器来说它是一个不完整类型。对于不完整类型,不能创建它的对象或做任何需要编译器了解 myclass 布局的事情,而不是 myclass 只是一种类型这一事实。即:编译器不知道它的成员是什么以及它的内存布局是什么。 但是由于指向所有对象的指针只需要相同的内存分配,因此您可以在仅将 Incomplete 类型作为指针引用时使用前向声明。

所以简而言之,您是在前向声明一个类,然后执行一些需要编译器知道该类的布局的操作,因为编译器不知道它因此错误。

【讨论】:

我认为值得指出的是,前向声明而不是标题是一件好事。因此,建议的解决方案应该是:在出现错误的 .cpp 中包含声明类型的标头。 @FrankOsterfeld:我忘了说我已经检查过了,所有前向声明的类都正确地包含在实现中。我今天做了一个最小的测试用例,其中不包括任何前向声明。我决定将这个问题恢复到原来的状态并接受你的回答,以便对其他人有所帮助(我想这个特定的问题之前已经回答过,所以也可以删除它)。我在最小的场景中添加了一个带有此错误的新问题here 这可以通过 Styne666 的回答来解决。我希望,以这种方式拆分它是可以的(对 SO 来说仍然是新的;))。我只是想,您的一般回答会对其他人有所帮助,而我的特定问题则更具体。【参考方案2】:

前向声明通常可以在您的标头中使用,只需确保您在顶部的相应代码文件中包含类的标头(例如#include "itemsource.h")。

响应编辑:如果我确定我已正确包含我自己的标题并且我仍然收到不完整的类型错误,那么下一步是将#include &lt;QGraphicsPixmapItem&gt; 更改为整个 Qt 包。除非有明显可识别的好处,否则我总是倾向于完全包含该软件包。它只是确保满足该包的内部依赖关系。

最后,在 Qt 4.x 中,QGraphicsPixmapItem 出现在 QtGui 中,但在 5.x 中已移出到 QtWidgets。因此,如果您使用 4,请尝试将 #include &lt;QGraphicsPixmapItem&gt; 替换为 #include &lt;QtGui&gt;,对于 5,请尝试使用 #include &lt;QtWidgets&gt;

【讨论】:

正如上面对弗兰克回答的评论中所解释的,我把问题分开了。已经有一个答案 - 闪电般的快!显然,我正在为这个网站打字慢下来;)。它和你的方式基本相同。但是,您可能会将该想法添加到通常包含用于测试的大包,而不是深入到“缺少包含”发生的位置。

以上是关于是啥导致类型不完整? (QGraphicsItem:源或目标的类型不完整)的主要内容,如果未能解决你的问题,请参考以下文章

下面声明的类型不能是不完整类型的语句是啥意思

QGraphicsItem 类型转换

是啥导致此运行时错误 13“类型不匹配”?

C语言不允许使用不完整的类型报错是啥意思啊

为啥将 lambda 传递给受约束的类型模板参数会导致“不完整类型”编译器错误?

typedef struct 导致“不允许指向不完整类型的指针”错误