diff --git a/src/libs/cplusplus/LookupContext.cpp b/src/libs/cplusplus/LookupContext.cpp index e28aaa17790f375b8e0906269ba6089cdca56da0..4e4e360fd77a5c4e979b3da4a47666242d73d8a9 100644 --- a/src/libs/cplusplus/LookupContext.cpp +++ b/src/libs/cplusplus/LookupContext.cpp @@ -447,6 +447,9 @@ void LookupContext::expandClass(Class *klass, const QList<Scope *> &visibleScopes, QList<Scope *> *expandedScopes) const { + for (TemplateParameters *params = klass->templateParameters(); params; params = params->previous()) + expand(params->scope(), visibleScopes, expandedScopes); + for (unsigned i = 0; i < klass->memberCount(); ++i) { Symbol *symbol = klass->memberAt(i); if (Class *nestedClass = symbol->asClass()) { @@ -510,6 +513,9 @@ void LookupContext::expandFunction(Function *function, const QList<Scope *> &visibleScopes, QList<Scope *> *expandedScopes) const { + for (TemplateParameters *params = function->templateParameters(); params; params = params->previous()) + expand(params->scope(), visibleScopes, expandedScopes); + if (! expandedScopes->contains(function->arguments())) expandedScopes->append(function->arguments()); diff --git a/src/libs/cplusplus/ResolveExpression.cpp b/src/libs/cplusplus/ResolveExpression.cpp index ca497beab0f0d0e3e0e09cb5d16c5fb0269755f9..5d934707ea94d4e8e90b0dcf090d066d840572d4 100644 --- a/src/libs/cplusplus/ResolveExpression.cpp +++ b/src/libs/cplusplus/ResolveExpression.cpp @@ -637,11 +637,15 @@ ResolveExpression::resolveBaseExpression(const QList<LookupItem> &baseResults, i if (NamedType *namedTy = ty->asNamedType()) { const QList<Scope *> visibleScopes = _context.visibleScopes(result); - const QList<Symbol *> typedefCandidates = _context.resolve(namedTy->name(), visibleScopes); - foreach (Symbol *typedefCandidate, typedefCandidates) { - if (typedefCandidate->isTypedef() && typedefCandidate->type()->isNamedType()) { - ty = typedefCandidate->type(); - lastVisibleSymbol = typedefCandidate; + const QList<Symbol *> candidates = _context.resolve(namedTy->name(), visibleScopes); + foreach (Symbol *candidate, candidates) { + if (candidate->isTypedef() && candidate->type()->isNamedType()) { + ty = candidate->type(); + lastVisibleSymbol = candidate; + break; + } else if (TypenameArgument *arg = candidate->asTypenameArgument()) { + ty = arg->type(); + lastVisibleSymbol = candidate; break; } }