@@ -303,6 +303,7 @@ class ClassDefImpl : public DefinitionMixin<ClassDefMutable>
303303 void setTemplateMaster (const ClassDef *tm) override ;
304304 void setImplicitTemplateInstance (bool b) override ;
305305 void setTypeConstraints (const ArgumentList &al) override ;
306+ void addMemberToTemplateInstance (const MemberDef *md, const ArgumentList &templateArguments, const QCString &templSpec) override ;
306307 void addMembersToTemplateInstance (const ClassDef *cd,const ArgumentList &templateArguments,const QCString &templSpec) override ;
307308 void makeTemplateArgument (bool b=TRUE ) override ;
308309 void setCategoryOf (ClassDef *cd) override ;
@@ -1308,6 +1309,20 @@ void ClassDefImpl::internalInsertMember(MemberDef *md,
13081309 MemberNameInfo *mni = m_allMemberNameInfoLinkedMap.add (md->name ());
13091310 mni->push_back (std::make_unique<MemberInfo>(md,prot,md->virtualness (),false ,false ));
13101311 }
1312+
1313+ // if we already created template instances before inserting this member (i.e. due to a typedef or using statement)
1314+ // then we also need to insert the member in the template instance.
1315+ for (const auto &ti : getTemplateInstances ())
1316+ {
1317+ // printf("member %s of class %s with template instance %s\n",qPrint(md->name()),qPrint(name()),
1318+ // qPrint(ti.templSpec));
1319+ ClassDefMutable *cdm = toClassDefMutable (ti.classDef );
1320+ if (cdm)
1321+ {
1322+ cdm->addMemberToTemplateInstance (md,templateArguments (),ti.templSpec );
1323+ }
1324+ }
1325+
13111326}
13121327
13131328void ClassDefImpl::insertMember (MemberDef *md)
@@ -4285,6 +4300,8 @@ ClassDef *ClassDefImpl::insertTemplateInstance(const QCString &fileName,
42854300 if (templateClass)
42864301 {
42874302 templateClass->setTemplateMaster (this );
4303+ ArgumentList tal = *stringToArgumentList (getLanguage (),templSpec);
4304+ templateClass->setTemplateArguments (tal);
42884305 templateClass->setOuterScope (getOuterScope ());
42894306 templateClass->setHidden (isHidden ());
42904307 templateClass->setArtificial (isArtificial ());
@@ -4330,34 +4347,40 @@ const TemplateNameMap &ClassDefImpl::getTemplateBaseClassNames() const
43304347 return m_templBaseClassNames;
43314348}
43324349
4350+ void ClassDefImpl::addMemberToTemplateInstance (const MemberDef *md,
4351+ const ArgumentList &templateArguments,
4352+ const QCString &templSpec)
4353+ {
4354+ auto actualArguments_p = stringToArgumentList (getLanguage (),templSpec);
4355+ auto imd = md->createTemplateInstanceMember (templateArguments,actualArguments_p);
4356+ // printf("%s->setMemberClass(%p)\n",qPrint(imd->name()),this);
4357+ auto mmd = toMemberDefMutable (imd.get ());
4358+ mmd->setMemberClass (this );
4359+ mmd->setTemplateMaster (md);
4360+ mmd->setDocumentation (md->documentation (),md->docFile (),md->docLine ());
4361+ mmd->setBriefDescription (md->briefDescription (),md->briefFile (),md->briefLine ());
4362+ mmd->setInbodyDocumentation (md->inbodyDocumentation (),md->inbodyFile (),md->inbodyLine ());
4363+ mmd->setMemberSpecifiers (md->getMemberSpecifiers ());
4364+ mmd->setMemberGroupId (md->getMemberGroupId ());
4365+ mmd->setArtificial (true );
4366+ insertMember (imd.get ());
4367+ // printf("Adding member=%s %s%s to class %s templSpec %s\n",
4368+ // imd->typeString(),qPrint(imd->name()),imd->argsString(),
4369+ // qPrint(imd->getClassDef()->name()),templSpec);
4370+ // insert imd in the list of all members
4371+ // printf("Adding member=%s class=%s\n",qPrint(imd->name()),qPrint(name()));
4372+ MemberName *mn = Doxygen::memberNameLinkedMap->add (imd->name ());
4373+ mn->push_back (std::move (imd));
4374+ }
4375+
43334376void ClassDefImpl::addMembersToTemplateInstance (const ClassDef *cd,const ArgumentList &templateArguments,const QCString &templSpec)
43344377{
43354378 // printf("%s::addMembersToTemplateInstance(%s,%s)\n",qPrint(name()),qPrint(cd->name()),templSpec);
43364379 for (const auto &mni : cd->memberNameInfoLinkedMap ())
43374380 {
43384381 for (const auto &mi : *mni)
43394382 {
4340- auto actualArguments_p = stringToArgumentList (getLanguage (),templSpec);
4341- MemberDef *md = mi->memberDef ();
4342- auto imd = md->createTemplateInstanceMember (templateArguments,actualArguments_p);
4343- // printf("%s->setMemberClass(%p)\n",qPrint(imd->name()),this);
4344- auto mmd = toMemberDefMutable (imd.get ());
4345- mmd->setMemberClass (this );
4346- mmd->setTemplateMaster (md);
4347- mmd->setDocumentation (md->documentation (),md->docFile (),md->docLine ());
4348- mmd->setBriefDescription (md->briefDescription (),md->briefFile (),md->briefLine ());
4349- mmd->setInbodyDocumentation (md->inbodyDocumentation (),md->inbodyFile (),md->inbodyLine ());
4350- mmd->setMemberSpecifiers (md->getMemberSpecifiers ());
4351- mmd->setMemberGroupId (md->getMemberGroupId ());
4352- mmd->setArtificial (true );
4353- insertMember (imd.get ());
4354- // printf("Adding member=%s %s%s to class %s templSpec %s\n",
4355- // imd->typeString(),qPrint(imd->name()),imd->argsString(),
4356- // qPrint(imd->getClassDef()->name()),templSpec);
4357- // insert imd in the list of all members
4358- // printf("Adding member=%s class=%s\n",qPrint(imd->name()),qPrint(name()));
4359- MemberName *mn = Doxygen::memberNameLinkedMap->add (imd->name ());
4360- mn->push_back (std::move (imd));
4383+ addMemberToTemplateInstance (mi->memberDef (),templateArguments,templSpec);
43614384 }
43624385 }
43634386 // also instantatie members for nested classes
0 commit comments