diff --git a/src/shared/cplusplus/Parser.cpp b/src/shared/cplusplus/Parser.cpp
index b4f46ac552a35e069ac36dbf1310ac8b119478d7..0b7ad74214d09711a93f987a0c20186e6c7d5ea0 100644
--- a/src/shared/cplusplus/Parser.cpp
+++ b/src/shared/cplusplus/Parser.cpp
@@ -986,7 +986,18 @@ bool Parser::parseTemplateDeclaration(DeclarationAST *&node)
             match(T_GREATER, &ast->greater_token);
     }
 
-    parseDeclaration(ast->declaration);
+    do {
+        unsigned start_declaration = cursor();
+
+        ast->declaration = 0;
+        if (parseDeclaration(ast->declaration))
+            break;
+
+        _translationUnit->error(start_declaration, "expected a declaration");
+        rewind(start_declaration + 1);
+        skipUntilDeclaration();
+    } while (LA());
+
     node = ast;
     return true;
 }