Вы можете хранить указатели на производные классы в контейнерах, содержащих базовые классы.Тем не менее, вы получаете указатель на базовый класс.Затем вы, как правило, либо используете только методы базового класса, либо используете dynamic_cast, чтобы проверить его тип на самом деле.
template<class Dialog,class Caller, class Parent>
Dialog* Main_Dialog::create_(Caller* caller, Parent* parent)
{
return (*dialogs_->insert(new Dialog(caller,parent)));
}
* диалогов _-> 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;
}