static_cast 从 'QgsVectorLayer *' 到 'QgsMapLayer *',没有继承关系,是不允许的

static_cast from 'QgsVectorLayer *' to 'QgsMapLayer *', which are not related by inheritance, is not allowed

Class QgsVectorlayer 派生自基数 class QgsMapLayer 派生自基数 class QObject。我想将 QgsVectorlayer 对象转换为基础 class。这应该很容易实现,但我收到错误并且不明白为什么。

错误消息(可能并非不重要)的附件是:

...qgsgeometry.h:46:7: note: 'QgsVectorLayer' is incomplete

第 46 行仅包含 QgsVectorLayer class 定义:

class QgsVectorLayer;

(参见来源 https://github.com/qgis/QGIS/blob/master/src/core/geometry/qgsgeometry.h#L46

这是我的用例: 我需要将我的改编函数 QgsOgrProvider::extent(QgsVectorLayer* vectorLayer) const 中的参数变量 vectorLayer 作为类型 QgsMapLayer*QObject* 的另一个函数传递给 QgsVectorlayer 派生的类型。我的理解是,这应该自动进行类型转换,或者我可以使用 static_cast<type>(variable) 进行类型转换,但我收到错误并且不明白为什么。

QgsVectorLayer的定义:

class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionContextGenerator, ...
{...}

(完整来源:https://github.com/qgis/QGIS/blob/master/src/core/vector/qgsvectorlayer.h

QgsMapLayer的定义:

class CORE_EXPORT QgsMapLayer : public QObject
{...}

(完整来源:https://github.com/qgis/QGIS/blob/master/src/core/qgsmaplayer.h

我的代码抛出错误:

QgsOgrProvider::extent(QgsVectorLayer* vectorLayer) const
{
...

QgsMapLayer * mapLayer=static_cast< QgsMapLayer*>(vectorLayer);
// error: static_cast from 'QgsVectorLayer *' to 'QObject *', which are not related by inheritance, is not allowed; qgsgeometry.h:46:7: note: 'QgsVectorLayer' is incomplete

QObject * mapObject=static_cast< QObject*>(vectorLayer);
// error: static_cast from 'QgsVectorLayer *' to 'QgsMapLayer *', which are not related by inheritance, is not allowed; qgsgeometry.h:46:7: note: 'QgsVectorLayer' is incomplete

QObject * mapObject2=new QObject();
// error: assigning to 'QObject *' from incompatible type 'QgsVectorLayer *'
mapObject2=vectorLayer;

...
}

在使用 static_cast 的地方缺少 class 的定义。仅仅因为 class 的定义存在于某些头文件中并不意味着编译器会在引用 class 的任何地方自动识别它。无论哪个头文件定义此 class 都不是 #included,因此编译器唯一知道的是已声明 class。

Line 46 contains only the QgsVectorLayer class definition:

class QgsVectorLayer;

翻译单元#included这个头文件,直接或间接。

The definition of QgsVectorLayer:

class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionContextGenerator, ... {...}

并且这个头文件不是 #included,直接或间接。

您需要了解如何正确 #include 所需的头文件。