@@ -269,7 +269,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
269
269
virtual void setTemplateBaseClassNames (QDict<int > *templateNames);
270
270
virtual void setTemplateMaster (const ClassDef *tm);
271
271
virtual void setTypeConstraints (const ArgumentList &al);
272
- virtual void addMembersToTemplateInstance (const ClassDef *cd,const char *templSpec);
272
+ virtual void addMembersToTemplateInstance (const ClassDef *cd,const ArgumentList &templateArguments, const char *templSpec);
273
273
virtual void makeTemplateArgument (bool b=TRUE );
274
274
virtual void setCategoryOf (ClassDef *cd);
275
275
virtual void setUsedOnly (bool b);
@@ -4034,16 +4034,35 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
4034
4034
{
4035
4035
QCString tcname = removeRedundantWhiteSpace (localName ()+templSpec);
4036
4036
Debug::print (Debug::Classes,0 ," New template instance class '%s''%s' inside '%s' hidden=%d\n " ,qPrint (name ()),qPrint (templSpec),qPrint (name ()),isHidden ());
4037
- templateClass =
4038
- toClassDefMutable (
4039
- Doxygen::classLinkedMap->add (tcname,
4040
- std::unique_ptr<ClassDef>(
4041
- new ClassDefImpl (fileName,startLine,startColumn,tcname,ClassDef::Class))));
4042
- templateClass->setTemplateMaster (this );
4043
- templateClass->setOuterScope (getOuterScope ());
4044
- templateClass->setHidden (isHidden ());
4045
- m_impl->templateInstances ->insert (templSpec,templateClass);
4046
- freshInstance=TRUE ;
4037
+
4038
+ templateClass = toClassDefMutable (Doxygen::classLinkedMap->find (tcname));
4039
+ if (templateClass==0 )
4040
+ {
4041
+ templateClass =
4042
+ toClassDefMutable (
4043
+ Doxygen::classLinkedMap->add (tcname,
4044
+ std::unique_ptr<ClassDef>(
4045
+ new ClassDefImpl (fileName,startLine,startColumn,tcname,ClassDef::Class))));
4046
+ templateClass->setTemplateMaster (this );
4047
+ templateClass->setOuterScope (getOuterScope ());
4048
+ templateClass->setHidden (isHidden ());
4049
+ m_impl->templateInstances ->insert (templSpec,templateClass);
4050
+
4051
+ // also add nested classes
4052
+ for (const auto &innerCd : m_impl->innerClasses )
4053
+ {
4054
+ QCString innerName = tcname+" ::" +innerCd->localName ();
4055
+ ClassDefMutable *innerClass =
4056
+ toClassDefMutable (
4057
+ Doxygen::classLinkedMap->add (innerName,
4058
+ std::unique_ptr<ClassDef>(
4059
+ new ClassDefImpl (fileName,startLine,startColumn,innerName,ClassDef::Class))));
4060
+ templateClass->addInnerCompound (innerClass);
4061
+ innerClass->setOuterScope (templateClass);
4062
+ innerClass->setHidden (isHidden ());
4063
+ }
4064
+ freshInstance=TRUE ;
4065
+ }
4047
4066
}
4048
4067
return templateClass;
4049
4068
}
@@ -4062,7 +4081,7 @@ ClassDef *ClassDefImpl::getVariableInstance(const char *templSpec) const
4062
4081
QCString tcname = removeRedundantWhiteSpace (name ()+templSpec);
4063
4082
templateClass = new ClassDefImpl (" <code>" ,1 ,1 ,tcname,
4064
4083
ClassDef::Class,0 ,0 ,FALSE );
4065
- templateClass->addMembersToTemplateInstance ( this , templSpec );
4084
+ templateClass->addMembersToTemplateInstance ( this , templateArguments (), templSpec );
4066
4085
templateClass->setTemplateMaster (this );
4067
4086
m_impl->variableInstances ->insert (templSpec,templateClass);
4068
4087
}
@@ -4093,17 +4112,17 @@ QDict<int> *ClassDefImpl::getTemplateBaseClassNames() const
4093
4112
return m_impl->templBaseClassNames ;
4094
4113
}
4095
4114
4096
- void ClassDefImpl::addMembersToTemplateInstance (const ClassDef *cd,const char *templSpec)
4115
+ void ClassDefImpl::addMembersToTemplateInstance (const ClassDef *cd,const ArgumentList &templateArguments, const char *templSpec)
4097
4116
{
4098
4117
// printf("%s::addMembersToTemplateInstance(%s,%s)\n",name().data(),cd->name().data(),templSpec);
4099
- for (auto &mni : cd->memberNameInfoLinkedMap ())
4118
+ for (const auto &mni : cd->memberNameInfoLinkedMap ())
4100
4119
{
4101
- for (auto &mi : *mni)
4120
+ for (const auto &mi : *mni)
4102
4121
{
4103
4122
auto actualArguments_p = stringToArgumentList (getLanguage (),templSpec);
4104
4123
MemberDef *md = mi->memberDef ();
4105
4124
std::unique_ptr<MemberDefMutable> imd { md->createTemplateInstanceMember (
4106
- cd-> templateArguments () ,actualArguments_p) };
4125
+ templateArguments,actualArguments_p) };
4107
4126
// printf("%s->setMemberClass(%p)\n",imd->name().data(),this);
4108
4127
imd->setMemberClass (this );
4109
4128
imd->setTemplateMaster (md);
@@ -4122,6 +4141,15 @@ void ClassDefImpl::addMembersToTemplateInstance(const ClassDef *cd,const char *t
4122
4141
mn->push_back (std::move (imd));
4123
4142
}
4124
4143
}
4144
+ // also instantatie members for nested classes
4145
+ for (const auto &innerCd : cd->getClasses ())
4146
+ {
4147
+ ClassDefMutable *ncd = toClassDefMutable (m_impl->innerClasses .find (innerCd->localName ()));
4148
+ if (ncd)
4149
+ {
4150
+ ncd->addMembersToTemplateInstance (innerCd,cd->templateArguments (),templSpec);
4151
+ }
4152
+ }
4125
4153
}
4126
4154
4127
4155
QCString ClassDefImpl::getReference () const
0 commit comments