diff --git a/src/shared/cplusplus/Bind.cpp b/src/shared/cplusplus/Bind.cpp
index 4062c266cb4c4b3e5225d090957ad205dc88c57e..c47878a4c8b1806faf381861719c2f12e6da452e 100644
--- a/src/shared/cplusplus/Bind.cpp
+++ b/src/shared/cplusplus/Bind.cpp
@@ -1862,15 +1862,23 @@ bool Bind::visit(ParameterDeclarationAST *ast)
 
 bool Bind::visit(TemplateDeclarationAST *ast)
 {
-    // unsigned export_token = ast->export_token;
-    // unsigned template_token = ast->template_token;
-    // unsigned less_token = ast->less_token;
+    Template *templ = control()->newTemplate(ast->firstToken(), 0);
+    ast->symbol = templ;
+    Scope *previousScope = switchScope(templ);
+
     for (DeclarationListAST *it = ast->template_parameter_list; it; it = it->next) {
         this->declaration(it->value);
     }
     // unsigned greater_token = ast->greater_token;
     this->declaration(ast->declaration);
-    // Template *symbol = ast->symbol;
+    (void) switchScope(previousScope);
+
+    if (Symbol *decl = templ->declaration()) {
+        templ->setSourceLocation(decl->sourceLocation(), translationUnit());
+        templ->setName(decl->name());
+    }
+
+    _scope->addMember(templ);
     return false;
 }