我有一个容器:
QSet < QDialog*> dialogs_;
我有几个继承自QDialog的Dialog,例如:
class _1_Dialog : public QDialog, private Ui::_1_Dialog
{};
class _2_Dialog : public QDialog, private Ui::_1_Dialog
{};
我想在我的'dialogs_'成员var中存储指向这些对话框的指针。但现在我收到了错误:
error: invalid conversion from 'QDialog*' to '_1_Dialog*' [-fpermissive]
在这种情况下使用-fpermissive是否可以,或者这是个坏主意?
编辑:
我有一个名为create_的fnc,在其正文中我有一个声明:
template<class Dialog,class Caller, class Parent>
Dialog* Main_Dialog::create_(Caller* caller, Parent* parent)
{
return (*dialogs_->insert(new Dialog(caller,parent)));
}
所以这就是行
这给了我上面提到的错误
答案 0 :(得分:1)
您可以存储指向包含基类的容器中的派生类的指针。但是,你得到的是指向基类的指针。然后,您通常只会使用基类方法,或者使用dynamic_cast来检查它的类型是什么。
template<class Dialog,class Caller, class Parent>
Dialog* Main_Dialog::create_(Caller* caller, Parent* parent)
{
return (*dialogs_->insert(new Dialog(caller,parent)));
}
* dialogs _-&gt; insert()是指向基类的指针。 你知道它总是指向一个类Dialog,但编译器没有,因为你从来没有说过它。试试这个:
template<class Dialog,class Caller, class Parent>
Dialog* Main_Dialog::create_(Caller* caller, Parent* parent)
{
Dialog* result = new Dialog(caller,parent);
dialogs_->insert(result);
return result;
}
答案 1 :(得分:0)
这是你的函数内部代码:
return (*dialogs_->insert(new Dialog(caller,parent))); ^ // Returning Base class pointer
您的返回类型为Dialog *
因此,从Base TO Derived
完成了一次转换,隐式转换在这里失败了。
尝试dynamic_cast
到Dialog指针(来自QDialog指针),然后返回。
答案 2 :(得分:0)
我还没有(还)尝试编写任何特定于您的问题的代码,但从架构角度来看,您的情况是OOP最常见和最明显的应用程序:任何Widget(例如)它是Widgets的容器(即一些更具体的GUI元素的基类)......
对我来说有什么奇怪的,为什么你从2个类派生,一个公共(ok)和一个私人(可能是一个对话框)?
BTW我认为这是导致错误的私密部分:尝试改为公开。