diff --git a/src/bindings/cpp/hammer.cxx b/src/bindings/cpp/hammer.cxx
index e7f3cb7496419a3b6ca50176ff6b4c4e2b91323f..4022f26da818a9b9937f18e6bac77e482a43023a 100644
--- a/src/bindings/cpp/hammer.cxx
+++ b/src/bindings/cpp/hammer.cxx
@@ -5,8 +5,8 @@ namespace hammer {
   typedef variant<BytesResult, UintResult, IntResult, NullResult, SequenceResult> AnyResult;
 
   const BytesResult::result_type BytesResult::result() { return _bytes; }
-  const UintResult::result_type UintResult::result() { return _uint; }
-  const IntResult::result_type IntResult::result() { return _sint; }
+  UintResult::result_type UintResult::result() { return _uint; }
+  IntResult::result_type IntResult::result() { return _sint; }
   const SequenceResult::result_type SequenceResult::result() { return _seq; }
 
   template<>
@@ -47,13 +47,13 @@ namespace hammer {
 
   template<>
   NullResult Parser<NullResult>::parse(const string &input) {
-    HParseResult *res = h_parse(_parser, reinterpret_cast<const uint8_t*>(input.c_str()), input.size());
+    h_parse(_parser, reinterpret_cast<const uint8_t*>(input.c_str()), input.size());
     return NullResult();
   }
 
   template<>
   NullResult Parser<NullResult>::parse(const uint8_t *input, size_t length) {
-    HParseResult *res = h_parse(_parser, input, length);
+    h_parse(_parser, input, length);
     return NullResult();
   }
 
diff --git a/src/bindings/cpp/hammer.hxx b/src/bindings/cpp/hammer.hxx
index c0c39c5a7f4a9a1d45c5b2b091e0ccb7966a82b2..f1a20e638682b2157ccef35ac9b7f6765f00f0ab 100644
--- a/src/bindings/cpp/hammer.hxx
+++ b/src/bindings/cpp/hammer.hxx
@@ -34,7 +34,7 @@ namespace hammer {
   public:
     typedef uint64_t result_type;
     UintResult(const uint64_t res) : _uint(res) { }
-    const result_type result();
+    result_type result();
   private:
     UintResult() { }
     result_type _uint;
@@ -44,7 +44,7 @@ namespace hammer {
   public:
     typedef int64_t result_type;
     IntResult(const int64_t res) : _sint(res) { }
-    const result_type result();
+    result_type result();
   private:
     IntResult() { }
     result_type _sint;
@@ -54,7 +54,7 @@ namespace hammer {
   public:
     NullResult() { }
     typedef void* result_type;
-    const result_type result() { return NULL; }
+    result_type result() { return NULL; }
   };
 
   class SequenceResult : public ParseResult<vector<variant<BytesResult, UintResult, IntResult, NullResult, SequenceResult> > > {
@@ -73,7 +73,7 @@ namespace hammer {
   template<class T> class Optional;
   class RepeatN;
   class Ignore;
-  class Indirect;
+  template<class T> class Indirect;
   template<class T> class IntRange;
 
   template<typename T>
@@ -491,9 +491,11 @@ namespace hammer {
     }
     */
     Indirect() : _p(0) {}
-    bind(Parser<T> &p) {
+    Indirect bind(Parser<T> &p) {
       this->_parser = h_indirect();
+      this->_p = p;
       h_bind_indirect(this->_parser, p.parser());
+      return *this;
     }
   private:
     Parser<T> _p;