我有上述问题,但原因显然在其他地方,因为之前曾经工作过,除了最小化项目的包含和转发声明之外,我没有做任何重大更改。
我有几个类,都来自某些QObjects
和UIElementInterface
。在以下示例中,QCheckBox
#ifndef CHECKBOX_H
#define CHECKBOX_H
#include <QCheckBox>
#include "uielementinterface.h"
#include <QString>
class QPoint;
class QSize;
class QWidget;
class CheckBox : public QCheckBox, public UIElementInterface
{
Q_OBJECT
//...
public:
CheckBox(const QString& label, const QString& define, const QString& header, const QPoint& pos, const QSize& size, QWidget *parent = 0);
};
#endif
和UIElementInterface
#ifndef UIELEMENTINTERFACE_H
#define UIELEMENTINTERFACE_H
class UIElementInterface
{
public:
virtual ~UIElementInterface(){}
UIElementInterface(const QString& define, const QString& header);
//...
};
#endif
在XmlReader
我转发声明CheckBox
(和UIElementInterface
)。在这里,我通过指针传递CheckBox*
作为其基础UIElementInterface
void XmlReader::readCheckBox(ContainerInterface* container, const QString& header)
{
Q_ASSERT(xml.isStartElement() && xml.name() == "checkbox");
QXmlStreamAttributes attr = xml.attributes();
CheckBox* checkBox = container->createCheckBox(getLabel(attr), getDefine(attr), getHeader(attr, header), getTopLeft(attr), getSize(attr));
m_centralWidget->setUIElement(getDefine(attr), checkBox); //<--Compiler Error, used to work fine.
xml.readElementText();
}
我在CheckBox
和UIElementInterface
构造函数中进行了一些打印,以验证两者的正确初始化。
以下是setUIElement
的实施:
void CentralWidget::setUIElement(const QString& define, UIElementInterface* UIElement)
{
m_uiElementMap[define] = UIElement;
}
从XmlReader
调用此内容给我:
error: no matching function for call to 'CentralWidget::setUIElement(QString, CheckBox*&)'
从static_cast
到CheckBox
的{{1}}会出现UIElementInterface
错误,而隐式演员会给我invalid static_cast
错误。
就像我说的那样,相同的继承模式曾经用于工作,据我所知它是有效的。所以: 我缺少什么?
提前致谢。
修改
这是编译器输出(用于调用cannot convert ... in initialization
):
setUIElement
../src/xmlreader.cpp:278: error: no matching function for call to 'CentralWidget::setUIElement(QString, CheckBox*&)'
../include/centralwidget.h:40: note: candidates are: void CentralWidget::setUIElement(const QString&, UIElementInterface*)
CentralWidget
答案 0 :(得分:0)
转m_centralWidget->setUIElement(getDefine(attr), checkBox);
到
m_centralWidget->setUIElement(getDefine(attr), (UIElementInterface*)checkBox);