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 都不是 #include
d,因此编译器唯一知道的是已声明 class。
Line 46 contains only the QgsVectorLayer class definition:
class QgsVectorLayer;
翻译单元#include
d这个头文件,直接或间接。
The definition of QgsVectorLayer:
class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public
QgsExpressionContextGenerator, ... {...}
并且这个头文件不是 #include
d,直接或间接。
您需要了解如何正确 #include
所需的头文件。
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 都不是 #include
d,因此编译器唯一知道的是已声明 class。
Line 46 contains only the QgsVectorLayer class definition:
class QgsVectorLayer;
翻译单元#include
d这个头文件,直接或间接。
The definition of QgsVectorLayer:
class CORE_EXPORT QgsVectorLayer : public QgsMapLayer, public QgsExpressionContextGenerator, ... {...}
并且这个头文件不是 #include
d,直接或间接。
您需要了解如何正确 #include
所需的头文件。